使用HAVING条件获取总行数

时间:2017-09-18 16:00:53

标签: mysql

以下查询将结果限制为20行,并且没有应用过滤器ID 6。

SELECT p.id, p.description
FROM   product p
LEFT JOIN product_filter pf 
ON pf.product_id = p.id
WHERE  p.status = TRUE
GROUP  BY p.id
HAVING SUM(pf.filter_id = '6') = 0 
ORDER  BY p.description ASC 
LIMIT  0, 20 

这很好用,但现在我想计算具有相同条件的行数。

SELECT COUNT(DISTINCT p.id) AS total 
FROM product p
LEFT JOIN product_filter pf 
ON pf.product_id = p.id
WHERE p.status = TRUE
HAVING SUM(pf.filter_id = 6) = 0

此查询返回零结果。

编辑:根据要求, SQLFiddle 以更详细的方式帮助您查看问题。

2 个答案:

答案 0 :(得分:2)

你错过了GROUP BY p.id. 没有GROUP BY的情况不起作用。

SELECT COUNT(DISTINCT p.id) AS total 
FROM product p
LEFT JOIN product_filter pf 
ON pf.product_id = p.id
WHERE p.status = TRUE
GROUP BY p.id
HAVING SUM(pf.filter_id = 6) = 0

演示http://sqlfiddle.com/#!9/00b12/6

答案 1 :(得分:0)

虽然@Raymond Nijland的答案是正确的,但在我的环境中,他建议的代码不起作用。

通过查看这篇文章COUNT(*) returning multiple rows instead of just one,我设法通过以下方式使其发挥作用:

SELECT COUNT(DISTINCT p.id) AS total 
FROM (SELECT p2.id 
      FROM product AS p2 
      LEFT JOIN product_filter pf 
        ON pf.product_id = p2.id 
      GROUP BY p2.id 
      HAVING SUM(pf.filter_id = '6') = 0) As p