2

带有示例数据的表“图像”:

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),它总是0sort列中返回,但不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
4

2 回答 2

2

首先,过滤封面图像(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
于 2012-05-27T18:28:39.223 回答
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
于 2012-05-27T22:10:55.063 回答