这需要一点解释(更重要的是,我不能在问题的标题中使用“问题”一词):
我有一个媒人小测验,包括以下表格(简体):
CREATE TABLE `Quiz` (
`quiz_id` int(10) unsigned NOT NULL,
`code` varchar(20) DEFAULT NULL,
`title` varchar(50) DEFAULT NULL,
PRIMARY KEY (`quiz_id`),
UNIQUE KEY `Quiz_1` (`code`)
);
CREATE TABLE `Quiz_Question` (
`quiz_id` int(10) unsigned NOT NULL,
`question_id` int(10) unsigned NOT NULL,
`question` varchar(250) DEFAULT NULL,
`type` int(10) unsigned NOT NULL, -- Lookup table of type of question: booean, radio, select, multiselect
PRIMARY KEY (`question_id`)
);
CREATE TABLE `Quiz_Answer` (
`question_id` int(10) unsigned NOT NULL,
`answer_id` int(10) unsigned NOT NULL,
`answer` varchar(250) DEFAULT NULL,
PRIMARY KEY (`answer_id`)
);
CREATE TABLE `Quiz_Response` (
`user_id` int(10) unsigned NOT NULL,
`quiz_id` int(10) unsigned NOT NULL,
`question_id` int(10) unsigned NOT NULL,
`answer_id` int(10) unsigned DEFAULT NULL,
UNIQUE KEY `Response_1` (`user_id`,`question_id`,`answer_id`),
KEY `Response_2` (`question_id`,`answer_id`)
);
到目前为止一切都很简单。
以前,查询是这样的(简化):
SELECT u.login, COUNT( u.user_id ) AS matches, ...
FROM User u
INNER JOIN Quiz_Response rep ON u.user_id = rep.user_id
WHERE u.active = 1
AND (
(rep.question_id = 3 AND rep.answer_id IN (20, 24)) OR
(rep.question_id = 10 AND rep.answer_id IN (83,84,85))
)
GROUP BY u.user_id
HAVING matches >= 2
ORDER BY u.login
note:i我们已经从create表和查询中删除了一些内容,例如某个内容是否处于活动状态、显示顺序、被阻止的用户、日期范围等,以关注核心问题。
因此,如果一个用户用20或24来回答问题3,他们会在结果中出现一次,如果他们用83、84或85来回答问题10,他们会出现第二次。然后,查询统计任何给定用户出现的次数,如果该次数等于或大于尝试匹配的问题数,则将其视为匹配(在这种情况下,匹配者检查了两个可能的问题,因此它们至少应为2个条目(匹配)。
我的问题是我引入了多项选择匹配。这有一个问题的最终结果,可以有多个比赛,抛出计数。
所以,如果一个搜索者说他们正在寻找用a,b,或c回答问题5的人,而一个用户说他们喜欢a,b,和c,那么这就变成了三个匹配,基本上抵消了另外两个问题(搜索了三个东西,得到了三个匹配,都是来自同一个问题)。
所以我要问的问题是,我如何检查每个给定的问题,它只得分1匹配,即使一个问题的多个答案匹配多次。
希望一切都有意义。
1条答案
按热度按时间ujv3wf0j1#
而不是指望
u.user_id
,依靠distinct rep.question_id
:所以如果我的
Quiz_Response
表如下所示:上述查询的输出将是: