【发布时间】:2013-09-17 06:24:03
【问题描述】:
我有一个现有站点,其数据库设计不正确且包含大量记录,因此我们无法更改数据库结构。
当前问题的数据库主要包含4个表,用户,问题,选项和答案。有一组标准的问题和选项,但对于每个用户,每组问题和选项的答案表中都有一行。数据库结构和示例数据可在SQL fiddle 获得。
现在作为高级搜索的新要求,我需要通过应用多个搜索过滤器来查找用户。示例输入和预期输出在 SQL Fiddle 上的 cmets 中给出。
我尝试应用所有类型的连接、交集,但它总是以某种方式失败。有人可以帮我编写正确的查询,最好是轻量级/优化连接,因为数据库包含大量记录(10000 多个用户、100 多个问题、500 多个选项和 500000 多个答案表中的记录)?
编辑:基于两个答案,我使用了以下查询
SELECT u.id, u.first_name, u.last_name
FROM users u
JOIN answers a ON a.user_id = u.id
WHERE (a.question_id = 1 AND a.option_id IN (3, 5))
OR (a.question_id = 2 AND a.option_id IN (8))
GROUP BY u.id, u.first_name, u.last_name
HAVING
SUM(CASE WHEN (a.question_id = 1 AND a.option_id IN (3, 5)) THEN 1 ELSE 0 END) >=1
AND SUM(CASE WHEN (a.question_id = 2 AND a.option_id IN (8)) THEN 1 ELSE 0 END) >= 1;
请注意:在真实数据库中,answers 表的 user_id、question_id 和 option_id 列已编入索引。
在SQL Fiddle 上给出的运行查询。
SQL Fiddle dnoeth 的回答。
SQL Foddle 为 calcinai 的回答。
【问题讨论】:
标签: mysql sql select intersection