SQL查询计算图片并获取封面图片

时间:2018-05-30 13:49:33

标签: mysql sql

我有表格图片,其中包含属性pictureId,albumName,isCover图片。

+--------+-----------+----------+
|   id   | albumName | coverPic |
+--------+-----------+----------+
| String | String    | Boolean  |
+--------+-----------+----------+

我需要编写查询以获取每张专辑中的图片数量,并获得每张专辑封面照片的ID。我写了这个查询,我得到了很多图片,但我不知道如何获得每张专辑封面图片的ID。

SELECT ALBUM as album, count(ALBUM) as  picsInAlbum, PICTURE_ID as pictureId 
FROM PICTURES 
group by ALBUM, PICTURE_ID

例如:

+--------+-----------+----------+
|   id   | albumName |isCover   |
+--------+-----------+----------+
| 1      | test      | true     |
+--------+-----------+----------+
+--------+-----------+----------+
| 2      | test      | false    |
+--------+-----------+----------+
+--------+-----------+----------+
| 3      | test1      | true    |
+--------+-----------+----------+
+--------+-----------+----------+
| 4      | test1      | false   |
+--------+-----------+----------+
+--------+-----------+----------+
| 5      | test2      | true    |
+--------+-----------+----------+
+--------+-----------+----------+
| 6      | test2      | false   |
+--------+-----------+----------+

作为查询结果我需要这个。

+--------+-----------+----------+
| ALBUM  |PICSINALBUM|coverPicId
+--------+-----------+----------+
+--------+-----------+----------+
| test   | 2         | 1        |
+--------+-----------+----------+
+--------+-----------+----------+
| test1  | 2         | 3        |
+--------+-----------+----------+
+--------+-----------+----------+
| test2  | 2         | 5        |
+--------+-----------+----------+

1 个答案:

答案 0 :(得分:2)

条件聚合。对每一行进行测试,以确定此行是否为专辑的“封面图片”。如果是,则返回picture_id,否则返回NULL。然后使用聚合函数来选择非NULL值。

这样的事情:

 SELECT p.album                                AS album
      , COUNT(p.album)                         AS picsInAlbum
      , MAX(IF(p.isCover=1,p.picture_id,NULL)) AS pictureId 
   FROM `PICTURES` p 
  GROUP
     BY p.album

注意:MySQL IF()功能可以用更便携的ANSI标准等效替换

      , MAX(CASE WHEN p.isCover = 1 THEN p.picture_id ELSE NULL END) AS pictureId 

注意:建议使用小写表格名称。

  

...最好采用一致的约定,例如始终使用小写名称创建和引用数据库和表。建议使用此约定以实现最大的便携性和易用性。

https://dev.mysql.com/doc/refman/5.7/en/identifier-case-sensitivity.html