簡體   English   中英

聚合MySQL數據,正在使用分組依據,但是它並沒有完全滿足我的要求

[英]Aggregate MySQL data, am using group by, but it isn't quite doing what I want

我有一個社區驅動的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       |
+-------+--------+--------+--------------+

因此,我的問題是,如何在2列上聚合數據,以便當color1為紅色而color2為藍色時,聚合函數將其與color1為藍色且color2為紅色時相同?

提前致謝!

如果只有兩個顏色列,則只需使用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`;

這是我要記住的邏輯,您需要實現它。

你基本上有一個選擇需要的最終選擇列內選擇查詢,加上被稱為顏色的新的自定義列,它基本上是一個串聯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查詢。

另外,當您僅可以按result_color分組時,我也不明白將其按兩種顏色分組的原因,但是我嘗試按照您的要求回答您的問題(可能是您有原因)

嘗試這個

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM