SQL количество запросов фото и получить изображение на обложке - PullRequest
0 голосов
/ 30 мая 2018

У меня есть изображения таблиц с атрибутами pictureId, albumName, isCover picture.

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

Мне нужно написать запрос, чтобы получить количество фотографий в каждом альбоме и идентификатор обложки для каждого альбома.Я написал этот запрос и получил несколько фотографий, но я не знаю, как получить идентификатор обложки для каждого альбома.

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 голосов
/ 30 мая 2018

Условное агрегирование.Проведите тест в каждом ряду, чтобы определить, является ли этот ряд «обложкой» для альбома.Если это так, верните picture_id, в противном случае верните 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...