2

私にはほぼ18の選択のユニオンがあり、各選択にはほぼ10の条件が含まれていますが、これらは1つの条件が異なるだけで同じです。以下のSQL構造を確認してください。

SELECT count(*) AS count, 'blue' as title 
FROM Users
WHERE [a long list of conditions,which are identical] AND eyes='blue'

UNION

SELECT count(*) AS count, 'hazel' as title 
FROM Users
WHERE [a long list of conditions,which are identical] AND eyes='hazel'

UNION

SELECT count(*) AS count, 'Black' as title 
FROM Users
WHERE [a long list of conditions,which are identical] AND eyes='black'

等々。

そのような種類のデータを取得するためのより良い方法は何ですか。より良いアイデアはありますか?

編集:

申し訳ありませんが、これらの条件は単一フィールドの「目」に基づいていません。たとえば、髪の毛、高さなどが異なる可能性があるため、groupbyを提案どおりに使用することはできません。

4

3 に答える 3

4

条件の合計が必要です。

select count(*),
       sum(case when eyes = 'blue' then 1 else 0 end) as blue,
       sum(case when eyes = 'hazel' then 1 else - end) as hazel,
       . . . 
from users
where <long list of conditions>

これにより、すべてが1行に配置されます。すべてを別々の行に入れるには、おそらく次のようにします。

select eyes, count(*)
from users
where <long list of conditions>
group by eyes

これにより、目の色ごとに個別の行が表示されます。

コメントに基づくと、最善のアプローチは、おそらく1つの行に要約してから、値のピボットを解除することです。残念ながら、MySQLにはピボットがないため、醜いものは効果的ですが、次のようになります。

select titles.title,
       max(case when titles.title= 'blue' then blue
                when titles.title = 'hazel' then hazel
                . . .
           end) as cnt
from (select count(*) as cnt,
             sum(case when eyes = 'blue' then 1 else 0 end) as blue,
             sum(case when eyes = 'hazel' then 1 else - end) as hazel,
             . . . 
      from users
      where <long list of conditionss
     ) cross join
     (select 'blue' as title union all
      select 'hazel' union all
      . . .
     ) titles
group by titles.title
于 2012-12-10T20:31:29.833 に答える
2

これは上記とまったく同じ出力ではありませんが、

select eyes, count(*)
from Users
where [a long list of conditions,which are identical]
group by eyes

あなたが望む情報をあなたに与えるべきです。

于 2012-12-10T20:32:05.670 に答える
0

各目の色のユーザー数を取得しようとしている場合は、次のことを試してください。

SELECT count( * ) AS c, 'eye'
FROM Users
WHERE .... all your conditions here ...
GROUP BY 'eye'
于 2012-12-10T20:39:13.167 に答える