计算满足查询的项目

时间:2012-04-06 18:51:58

标签: mysql sql select having

假设我有

SELECT * FROM table t
GROUP BY j
HAVING condition_one OR condition_two OR condition_three

如何修改查询,使其返回满足条款中三个不同条件的行数的COUNT

理想情况下,输出会有类似的结果:

condition_one: 100
condition_two: 200
condition_three: 300

其中有100个项目满足condition_one,200个满足condition_two等

2 个答案:

答案 0 :(得分:2)

SELECT
  SUM(IF(condition_one,1,0)) AS condition_one,
  SUM(IF(condition_two,1,0)) AS condition_two,
  SUM(IF(condition_three,1,0)) AS condition_three
FROM (
  SELECT * FROM t
  GROUP BY j
) AS baseview

答案 1 :(得分:0)

如果使用having子句,您实际上会丢失这些记录。所以你不能使用having子句。除此之外,如果您使用OR,那么您将不会在true中产生哪种条件。

因此,您应该使用的是一个包含所有分组值的派生表。完成后,查询该表以获取每个表的计数。但是,该解决方案将为您提供三列而不是三行。让我们选择那个更容易的那个:

SELECT
    SUM(condition_one) condition_one,
    SUM(condition_two) condition_two,
    SUM(condition_three) condition_three
FROM (
    SELECT * FROM t
    GROUP BY j
) final

请注意condition_one实际上是一个条件,例如age = 23,但MySQL中的条件为0返回false1返回true所以你实际上可以SUM条件。

现在,如果你想让它们成行,那就更复杂了,因为你必须独立地UNION每个值:

SELECT 'condition_one: ' Condition, SUM(condition_one) ConditionCount FROM (
    SELECT * FROM t GROUP BY j
) s1
UNION ALL
SELECT 'condition_two: ', SUM(condition_two) FROM (
    SELECT * FROM t GROUP BY j
) s2
UNION ALL
SELECT 'condition_three: ', SUM(condition_three) FROM (
    SELECT * FROM t GROUP BY j
) s3

或者至少,这是我现在能想到的最佳方式。希望这有帮助!