我有一个现有站点,其数据库设计不正确且包含大量记录,因此我们无法更改数据库结构。
当前问题的数据库主要包含4个表格,用户,问题,选项和答案。有一组标准的问题和选项,但对于每个用户,每组问题和选项的答案表中都有一行。数据库结构和示例数据可在SQL fiddle获得。
现在作为高级搜索的新需求,我需要通过应用多个搜索过滤器来查找用户。示例输入和预期输出在SQL Fiddle的评论中给出。
我试图应用所有类型的连接、交叉点,但它总是以某种方式失败。有人可以帮我编写正确的查询,最好是轻量级/优化连接,因为数据库包含大量记录(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;
请注意:在真实数据库中,列user_id
和question_id
表的索引option_id
。answers
运行SQL Fiddle上给出的查询。
用于 calcinai 答案的SQL Foddle 。