2

iOSゲーム用のコミュニティ主導のデータベースがあります。コミュニティによって収集したデータを集約しようとしていますが、次のようになります。

+--------+--------+--------------+
| color1 | color2 | result_color |
+--------+--------+--------------+
| red    | blue   | purple       |
| blue   | red    | purple       |
| red    | blue   | purple       |
| yellow | blue   | green        |
+--------+--------+--------------+

現在、次のクエリを実行しています。

select
    count(*) as count,
    `Mixes`.*
from
    `mixes` AS `Mixes`
where
    `result_color` = 'purple'
group_by
    color1,
    color2
order by
    `count` desc

これにより、次の出力が生成されます。

+-------+--------+--------+--------------+
| count | color1 | color2 | result_color |
+-------+--------+--------+--------------+
| 2     | red    | blue   | purple       |
| 1     | blue   | red    | purple       |
+-------+--------+--------+--------------+

ただし、色を混合するときは、最初にどの色を混合するかは問題ではないため、次の出力を生成したいと思います。

+-------+--------+--------+--------------+
| count | color1 | color2 | result_color |
+-------+--------+--------+--------------+
| 3     | red    | blue   | purple       |
+-------+--------+--------+--------------+

それで、私の質問は、color1が赤でcolor2が青の場合、集計関数がcolor1が青でcolor2が赤の場合と同じようにデータを処理するように、2列にわたってデータを集計するにはどうすればよいですか?

前もって感謝します!

4

3 に答える 3

1

2つのカラー列がある場合は、CASE式を使用して簡単に並べ替えることができます。

SELECT
  COUNT(*) AS `count`,
  CASE WHEN color1 < color2 THEN color1 ELSE color2 END AS color1,
  CASE WHEN color1 >= color2 THEN color1 ELSE color2 END AS color2,
  resultcolor
FROM mixes
WHERE resultcolor = 'purple'
GROUP BY
  CASE WHEN color1 < color2 THEN color1 ELSE color2 END,
  CASE WHEN color1 >= color2 THEN color2 ELSE color1 END,
  resultcolor
ORDER BY `count`;
于 2012-05-10T17:01:27.743 に答える
0

これが私が念頭に置いているロジックであり、あなたはそれを実装する必要があります。

基本的に、必要な最終選択列を選択する内部選択クエリに加えて、colorと呼ばれる新しいカスタム列があります。これは基本的に連結でcolor1ありcolor2、辞書式順序で小さい文字列が常に大きい文字列と連結されるというロジックが追加されています。 SQLでswitch/ifステートメントを使用して実行されます。

したがって、カスタム列は両方の行のcolorようになります。bluered

これで、このカスタム列でグループ化する外部クエリが作成され、目的の出力が得られるはずです。

比較と選択のSQLは次のようになります。

SELECT CASE WHEN STRCMP(color1,color2)<=0 THEN color2+''+color1 ELSE color1+''+color2 END
FROM Mixes
WHERE result_color='purple'

それがうまくいくことを願っています。自分自身に満足している場合は、SQLクエリ全体を作成しようとするかもしれません。

また、result_colorでグループ化できるのに、2色でグループ化する理由がわかりませんでしたが、質問どおりに回答しようとしました(理由があるかもしれません)

于 2012-05-10T16:55:35.460 に答える
0

これを試して

SELECT COUNT(*) AS `Count`, M.*
FROM
(SELECT
  CASE WHEN color1 < color2 THEN color1 ELSE color2 END AS color1,
  CASE WHEN color1 > color2 THEN color1 ELSE color2 END AS color2,
  result_color
FROM mixes
WHERE result_color = 'purple') M
GROUP BY M.color1, M.color2
ORDER BY
    `Count` DESC
于 2012-05-10T17:27:20.133 に答える