0

私が持っていると仮定します

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

句の 3 つの異なる条件を満たした行数の COUNT を返すようにクエリを変更するにはどうすればよいですか

理想的には、出力は次のようになります。

condition_one: 100
condition_two: 200
condition_three: 300

condition_one を満たす 100 個のアイテム、condition_two を満たす 200 個のアイテムなどがあります。

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

したがって、使用する必要があるのは、グループ化されたすべての値を保持する派生テーブルです。それができたら、そのテーブルをクエリして、それぞれのカウントを取得します。ただし、このソリューションでは、3行ではなく3列が提供されます。簡単なものを選びましょう:

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 に答える