我有users表和regulations表。
对于每个用户,每个规则上有4行。
例如: user_id 1接受了所有的规则,因此他将在regulations表中拥有类似的记录:
现在我要做的是选择所有的用户,谁接受了所有的规定。
不太清楚我应该如何构造这个查询的HAVING部分。
这是我的观点,但我几乎肯定它是错误的,此外,它说它没有看到regulations.regulation列:
SELECT users.* FROM users
JOIN regulations ON regulations.user_id = users.id
GROUP BY regulations.user_id
HAVING
(regulations.regulation = 1 AND regulations.accepted = 1)
and (regulations.regulation = 2 AND regulations.accepted = 1)
and (regulations.regulation = 3 AND regulations.accepted = 1)
and (regulations.regulation = 4 AND regulations.accepted = 1)问题:,选择所有接受=1的用户的正确方法是什么?
发布于 2018-08-17 10:29:57
你可以这样做:
SELECT users.id FROM users
INNER JOIN regulations ON regulations.user_id = users.id
WHERE regulations.accepted = 1
GROUP BY users.id
HAVING count(distinct regulations.regulation) = 4它从users表中选择不同接受规则的数目为4的所有users.id。“拥有”子句中的计数不同,以确保如果同一条规则出现两次,则只计算一次。它不检查的是,所接受的条例是1、2、3或4之一。
另一个选项是使用嵌套查询而不是内部连接来实现同样的效果:
SELECT * from users u
WHERE 4 = ( SELECT count(distinct regulation)
FROM regulations r
WHERE r.user_id=u.id and r.accepted=1 )最后一项(这取决于每项规定的不同价值),不包括何处或有条款而不计算在内:
SELECT u.* from users u
INNER JOIN regulations r1 ON r1.user_id=u.id and r1.accepted=1 and r1.regulation=1
INNER JOIN regulations r2 ON r2.user_id=u.id and r2.accepted=1 and r2.regulation=2
INNER JOIN regulations r3 ON r3.user_id=u.id and r3.accepted=1 and r3.regulation=3
INNER JOIN regulations r4 ON r4.user_id=u.id and r4.accepted=1 and r4.regulation=4还请参见测试:小提琴
发布于 2018-08-17 10:20:11
使用where子句尝试下面的查询,而不是使用子句:
SELECT users.* FROM users
JOIN regulations ON regulations.user_id = users.id
where regulations.accepted = 1 and regulations.regulation in (1,2 ,3 ,4)
GROUP BY regulations.user_id having count(distinct regulations.regulation)=4https://stackoverflow.com/questions/51893247
复制相似问题