2012-05-10 5 views
2

私はiOSゲーム用のコミュニティ駆動型データベースを持っています。集計したMySQLデータは、グループを使用していますが、私が欲しいものをやっていません。

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

次の出力を生成します、私は次のクエリを実行している現在、

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

:私はコミュニティによって収集したデータを集計しようとしています、そして、それは次のようになります:

+-------+--------+--------+--------------+ 
| 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が赤のときと同じようにデータを集計する方法を教えてください。

ありがとうございます!ここ

答えて

1

を求めているよう:

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`; 
+0

これは間違いなく動作しますが、グループの前にcolumn1とcolumn2をソートするだけです。これは数百万の結果セットであれば非常に効率が悪く、必要以上に時間がかかることがあります。 – Churk

+0

これは完全に機能し、結果セットの制限について知っておくとよいでしょう。迅速な対応に感謝します。 – cyphun

0

は私が考えている、あなたはそれを実装する必要がロジック..です

あなたは基本的に必要な最終選択の列を選択する内部選択クエリ、プラスである色と呼ばれる新しいカスタム列を、持っています基本的にはcolor1color2の連結ですが、辞書的に小さい文字列は常に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クエリ全体を試してみるかもしれません..

また、2つの色でグルーピングする理由を理解できませんでしたが、result_colorでグループ化することはできますが、あなたの質問あなたはちょうど2つの色の列を持っている場合は、単純CASE式でそれらを注文することができます(あなたの理由がある場合もある)

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 
をお試しください
関連する問題