【问题标题】:Select with multiple conditions from a single user从单个用户中选择多个条件
【发布时间】:2020-12-09 17:28:09
【问题描述】:

我想在数据库(MySql)中搜索所有与我参加过相同考试的用户。

数据库的结构是id、user_id、exam_id和date

嗯,我已经用id 5,8,9完成了考试,我想知道有多少人和我一样(例如,其他参加过5,7,9考试的用户不算在内) , 只有 5,8,9) 的用户

如果有人考了 4、5、8 和 9,而我考了 4、8、9,那也算数,因为他们一致认为我们已经进行了纵容。

其他用户是否有更多无关紧要

【问题讨论】:

  • 如果有人拿了 4、5、8 和 9 怎么办?
  • 不能简单吗exam_id IN (5,8,9)?或者我在问题中遗漏了什么?
  • 它必须是 5、8 和 9,结果为 OR
  • 如果有人参加了 4、5、8 和 9 考试,而我参加了 4、8、9 考试,那也算数,因为他们一致认为我们已经完成了纵容。其他用户是否有更多也没关系(抱歉之前说得更清楚了)

标签: mysql sql inner-join having-clause relational-division


【解决方案1】:

您可以使用一些关系划分技术:

select e.user_id
from exams e
inner join exams e1 on e1.exam_id = e.exam_id and e1.user_id <> e.user_id
where e1.user_id = ?
group by e.user_id
having count(*) = (select count(*) from exams where user_id = ?)

这会带来已参加用户 ? 参加的所有考试的用户。如果您想要完全匹配(即过滤掉参加过更多测试的用户):

select e.user_id
from exams e
left join exams e1 
    on  e1.exam_id = e.exam_id 
    and e1.user_id <> e.user_id
    and e1.user_id = ?
group by e.user_id
having count(e1.user_id) = (select count(*) from exams where user_id = ?)

如果每个用户没有太多考试,也可以使用字符串聚合:

select user_id
from exams 
where user_id <> ?
group by user_id
having group_concat(exam_id order by exam_id) = (
    select group_concat(exam_id order by exam_id) from exams where user_id = ?
)

【讨论】:

    猜你喜欢
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2013-04-25
    • 2013-08-01
    相关资源
    最近更新 更多