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 - 获取特定行(不总是第一行)的主要内容,如果未能解决你的问题,请参考以下文章

如何在mysql中使用带有group by的子查询?

无论如何,他们是不是要向使用 group by 返回特定列的最新行的查询添加连接

使用 GROUP BY 和 ORDER BY pl/sql 获取结果集的 N 到 M 行 [重复]

具有特定条件的 MySQL GROUP BY

在 mysql 中使用 group by 查询和 order by 查询选择

SQL 查询 - 如何使用 group by 获取 2 行或更多行