0

假设我有

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 等

4

2 回答 2

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
于 2012-04-06T18:55:52.610 回答
0

如果您使用having子句,您实际上会丢失这些记录。所以你不能使用having子句。除此之外,如果你使用ORs,那么你不会有哪个条件导致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 中的条件返回0forfalse1for,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

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

于 2012-04-06T19:36:19.307 回答