聚合 MySQL 数据,正在使用 group by,但它并没有完全符合我的要求
Posted
技术标签:
【中文标题】聚合 MySQL 数据,正在使用 group by,但它并没有完全符合我的要求【英文标题】:Aggregate MySQL data, am using group by, but it isn't quite doing what I want 【发布时间】:2012-05-19 07:14:41 【问题描述】:我有一个用于 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 为红色时相同?
提前致谢!
【问题讨论】:
【参考方案1】:这是我想到的逻辑,你需要实现它..
您基本上有一个内部选择查询,它选择所需的最终选择列,加上一个称为颜色的新自定义列,它基本上是 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】:如果您只有两个颜色列,您可以简单地使用 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`;
【讨论】:
这肯定行得通,你基本上是在分组之前对 column1 和 column2 进行排序,我唯一要提到的是,如果这是数百万的结果集,这将非常低效并且可能需要更长的时间比你想要的。 这完全有效,很高兴了解结果集的限制。谢谢大家的快速回复。【参考方案3】:试试这个
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
【讨论】:
以上是关于聚合 MySQL 数据,正在使用 group by,但它并没有完全符合我的要求的主要内容,如果未能解决你的问题,请参考以下文章