汇总MySQL数据,我正在使用group by,但它并没有完全按我的意愿行事

时间:2012-05-10 16:46:05

标签: mysql database aggregate

我有一个用于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为红色时相同?

提前致谢!

3 个答案:

答案 0 :(得分:1)

如果您只有两个颜色列,则只需使用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`;

答案 1 :(得分:0)

这是我想到的逻辑,你需要实现它..

您基本上有一个内部选择查询,用于选择所需的最终选择列,以及一个名为color的新自定义列,它基本上是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对它进行分组,但是我试图按照你的要求回答你的问题(可能是你有理由)

答案 2 :(得分: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