MySQL 查询:GROUP BY - 获取特定行(不总是第一行)
Posted
技术标签:
【中文标题】MySQL 查询:GROUP BY - 获取特定行(不总是第一行)【英文标题】:MySQL query: GROUP BY - get specific row (not always the first one) 【发布时间】:2012-06-02 07:39:58 【问题描述】:带有示例数据的表格“图像”:
id | user_id | album_id | sort
1 15 1 1
2 15 1 2
3 15 1 0
4 15 2 0
5 15 2 1
6 15 3 0
mysql 查询:
SELECT id, sort, COUNT(*) FROM images WHERE user_id=15 GROUP BY album_id
查询为每个唯一组合返回一行。但是,你怎么知道它选择了哪一行的id
?例如。带有sort=0
的图片是专辑的封面图片。此图像的文件路径包含id
。那么,如何始终获取行的 id,sort=0
?
我试过MIN(sort)
,它总是在sort
列中返回0
,但不是该列的正确id
...? ORDER BY sort
只对结果进行排序...也不是解决方案。
非常感谢任何帮助!非常感谢您!
编辑:希望这将有助于更好地理解:
查询例如给出以下结果:
id | sort | count
1 1 3
4 0 2
6 0 1
但是,怎么可能总是得到这个特定的行,sort
的值是0
?例如
id | sort | count
3 0 3
4 0 2
6 0 1
【问题讨论】:
您真正想要实现的目标是什么?也许您可以插入几个类似的表格来显示当前和期望的结果? @AndrewLeach:谢谢,请查看包含当前输出和所需输出的更新问题。希望现在更清楚... 其他 SQL 引擎会拒绝此查询,因为存在逻辑问题 -sort
列未包含在聚合函数或 GROUP BY
子句中......这只是 MySQL 是 MySQL。请参阅this question 和链接材料,以及this post。
@DCoder:谢谢你的链接!是的,这是有道理的。实际上,我使用SELECT
中的sort
列来显示sort
的输出,在我的情况下,如果它始终是0
,那么SELECT
无论如何都是没有意义的。但这是一个很好的观点,再次感谢!
【参考方案1】:
首先,过滤封面图像 (WHERE sort = 0
),然后简单地计算该 album_id
的所有图像。
SELECT id,
sort,
(SELECT COUNT(*)
FROM images t
WHERE t.album_id = i.album_id) AS count
FROM images i
WHERE user_id = 15
AND sort = 0
【讨论】:
好的,谢谢 Joao!所以似乎只有一个选择没有子选择没有解决方案,我只是想知道是否真的没有或者我太盲目了...... :) 谢谢你的回答!【参考方案2】:有一种方法可以在没有相关子查询的情况下做到这一点:
SELECT id, sort, isum.cnt
FROM images i join
(select i.album_id, count(*) as cnt
from images
) isum
on i.album_id = isum.album_id
WHERE user_id = 15 and
sort = 0
我通常更喜欢将我的所有表都列在“from”子句中。但是,当album_id上有索引时,一些数据库会比这种形式更好地优化相关子查询。
另外,我将第三个字段从“count”重命名为“cnt”。在 SQL 保留字之后命名列是一个非常非常糟糕的主意,除非你真的必须这样做。
最后,大多数其他 SQL 方言都支持窗口函数。所以,如果你改变数据库,你可以做类似的事情
select id, sort, count(*) over (partition by album_id)
from images
where user_id = 15 and
sort = 0
【讨论】:
以上是关于MySQL 查询:GROUP BY - 获取特定行(不总是第一行)的主要内容,如果未能解决你的问题,请参考以下文章
无论如何,他们是不是要向使用 group by 返回特定列的最新行的查询添加连接
使用 GROUP BY 和 ORDER BY pl/sql 获取结果集的 N 到 M 行 [重复]