选择具有多个参数的HAVING

时间:2018-08-17 10:18:49

标签: mysql sql database

我有<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" /> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script> <title></title> <style> .button { display: none; } input:hover + .button, .button:hover { display: inline-block; } </style> </head> <body> <div class="small-4 columns"> <input type="text" value="Hi" /> <button class="button" onclick="alert('Hello');">Click Me</button> </div> </body> </html>表和users表。

对于每个用户,每个规则有4行。

例如:user_id 1接受了所有规则,因此他将在规则表中具有类似的记录:

  1. user_id = 1,法规= 1,已接受= 1
  2. user_id = 1,法规= 2,已接受= 1
  3. user_id = 1,法规= 3,已接受= 1
  4. user_id = 1,法规= 4,已接受= 1

现在我要做的就是选择所有接受所有规定的用户。

不确定我应该如何构造此查询的regulations部分。

这是我的看法,但我几乎可以肯定这是错误的,此外它说没有看到HAVING列:

regulations.regulation

问题:选择所有接受了全部4条法规= 1的所有用户的正确方法是什么?

2 个答案:

答案 0 :(得分:4)

您可以执行以下操作:

httr

它从用户表中选择所有user.id,其中不同的接受规则数为4。“ HAVING”子句中不同的计数是确保如果相同的规则出现两次,则只计数一次。 它不会检查的是接受的法规是1,2,3还是4。

另一个使用嵌套查询而不是内部联接的选项,效果相同:

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

最后一个(确实取决于每个规则的值)没有WHERE或HAVING子句,也没有COUNT:

SELECT * from users u
WHERE 4 = ( SELECT count(distinct regulation) 
            FROM regulations r
            WHERE r.user_id=u.id and r.accepted=1 )

另请参阅测试:Fiddle

答案 1 :(得分:2)

尝试在以下查询中使用where子句,而不使用having子句:

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)=4