对 GROUP BY 聚合进行排序

发布于 2024-12-15 18:07:44 字数 1133 浏览 2 评论 0原文

想象一下这个表t1

+----------+-------+--------+
| group_id |  name |  age   |
+----------+-------+--------+
|    1     |   A1  |   1    |
|    1     |   A2  |   2    |
|    1     |   A3  |   3    |
|    2     |   B1  |   4    |
+----------+-------+--------+

在MySQL中使用以下查询,

SELECT group_id, name, COUNT(*) FROM t1 GROUP BY group_id

我们得到,

+----------+-------+--------+----------+
| group_id |  name |  age   | COUNT(*) |
+----------+-------+--------+----------+
|    1     |   A1  |   2    |    3     |
|    2     |   B1  |   4    |    1     |
+----------+-------+--------+----------+

正如你在这里看到的,值name=A1和age=2可能不是来自同一条记录。


我的问题是,如何控制显示 nameage 列中的单个结果,以便内容来自一条记录?有没有办法以某种方式对它们进行排序?例如,按年龄逆序排序将给予

+----------+-------+--------+----------+
| group_id |  name |  age   | COUNT(*) |
+----------+-------+--------+----------+
|    1     |   A3  |   3    |    3     |
|    2     |   B1  |   4    |    1     |
+----------+-------+--------+----------+

感谢。

Imagine this table t1,

+----------+-------+--------+
| group_id |  name |  age   |
+----------+-------+--------+
|    1     |   A1  |   1    |
|    1     |   A2  |   2    |
|    1     |   A3  |   3    |
|    2     |   B1  |   4    |
+----------+-------+--------+

Using the following query in MySQL,

SELECT group_id, name, COUNT(*) FROM t1 GROUP BY group_id

we get,

+----------+-------+--------+----------+
| group_id |  name |  age   | COUNT(*) |
+----------+-------+--------+----------+
|    1     |   A1  |   2    |    3     |
|    2     |   B1  |   4    |    1     |
+----------+-------+--------+----------+

As you can see here, it's possible that values name=A1 and age=2 are not from the same record.


My question is, how can I control which single results form the name and age columns are shown, so the content is from one record? Is there a way to sort them in some way? Fro example sorting by age in reverse order would give

+----------+-------+--------+----------+
| group_id |  name |  age   | COUNT(*) |
+----------+-------+--------+----------+
|    1     |   A3  |   3    |    3     |
|    2     |   B1  |   4    |    1     |
+----------+-------+--------+----------+

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

呆橘 2024-12-22 18:07:44

我不知道你为什么说你的查询有效。您还应该按名称分组...

SELECT group_id, name, COUNT(*) FROM t1 GROUP BY group_id, name

如果您只想获得其中一个,请尝试:

SELECT group_id, MIN(name), COUNT(*) FROM t1 GROUP BY group_id

I don't know why do you say that your query works. You should also group by name...

SELECT group_id, name, COUNT(*) FROM t1 GROUP BY group_id, name

If you want to get only one of them, try:

SELECT group_id, MIN(name), COUNT(*) FROM t1 GROUP BY group_id
葵雨 2024-12-22 18:07:44

我不知道完全控制,但你可以这样做

SELECT student_name, MIN(test_score), MAX(test_score)
        FROM student
        GROUP BY student_name;

I don't know about full control, but you can do like this

SELECT student_name, MIN(test_score), MAX(test_score)
        FROM student
        GROUP BY student_name;
秋叶绚丽 2024-12-22 18:07:44
SELECT group_id, name, COUNT(*)
FROM t1 
WHERE name IN ( 'xxx', 'yyy', ..., 'zzz' )
GROUP BY group_id
SORT BY COUNT(*)
SELECT group_id, name, COUNT(*)
FROM t1 
WHERE name IN ( 'xxx', 'yyy', ..., 'zzz' )
GROUP BY group_id
SORT BY COUNT(*)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文