MySQL查询:GROUP BY - 获取特定行(并不总是第一行)

时间:2012-05-27 18:11:27

标签: mysql sql database group-by

表格“图像”包含样本数据:

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)0列中始终返回sort,但不是该列的id ... ORDER BY sort只对结果进行排序......也不是解决方案。

非常感谢任何帮助!非常感谢你提前!

编辑:希望这有助于更好地理解:

查询,例如得出以下结果:

id | sort | count
1     1      3
4     0      2
6     0      1

但是,如何始终获得sort的{​​{1}}值为0的特定行? E.g。

id | sort | count
3     0      3
4     0      2
6     0      1

2 个答案:

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

答案 1 :(得分:1)

有一种方法可以在没有相关子查询的情况下执行此操作:

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