Оператор внутреннего соединения с ограничением в одной из трех таблиц


Я пытаюсь получить данные из трех таблиц (фото, альбомы, album_photos), затем программа ищет альбомы пользователя в таблице альбомов, затем ищет для каждого альбома идентификаторы фотографий в album_photos, а затем для каждого идентификатора просматривает таблицу фотографий все данные по идентификатору.

Вчера я спросил что-то вроде этого: внутреннее соединение с 3 таблицами, но теперь, я думаю, что вопрос другой, мне интересно, как я могу добавить предел к запросу inner join.

Итак, я работаю сейчас в этот код:

SELECT a.album_name, a.album_id, c.* 
FROM albums a
INNER JOIN album_photos b ON a.album_id = b.album_id
INNER JOIN photos c ON b.photo_id = c.photo_id
WHERE (
  SELECT COUNT(*) 
  FROM album_photos d
  WHERE b.album_id = d.album_id
  AND d.nick =  :nick
) <=5

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

Другие люди говорили мне, что вы не можете этого сделать, я считаю, что это не так, потому что язык SQL очень сложен, и я думаю, что у нас должен быть инструмент для этого. Есть ли какой-нибудь способ сделать это надлежащим образом?

*в ссылке, которой я поделился выше я привел пример о выходных данных.

2 2

2 ответа:

Попробуйте изменить предложение where на следующее:

WHERE (
  SELECT COUNT(*) 
  FROM album_photos d
  WHERE d.album_id = b.album_id and
        d.photo_id <= b.photo_id
  AND d.nick =  :nick
) <= 5
Это подсчитывает количество фотографий по порядку, а не только количество фотографий в альбоме.

Так как album_photos имеет связь отображения между фотографиями и альбуминами, вы можете указать количество фотографий для объединения с помощью TOP:

SELECT a.album_name, a.album_id, p.* 
FROM albums a
INNER JOIN album_photos ap ON 
   ap.photo_id = (select top 5 photo_id from album_photos where a.album_id = ap.album_id order by photo_id)
INNER JOIN photos p ON ap.photo_id = p.photo_id

Порядок по photo_id в подзапросе гарантирует, что будут возвращены те же 5 (или меньше) фотографий

РЕДАКТИРОВАТЬ ПО КОММЕНТАРИЮ. Изменение для использования MySQL LIMIT вместо T-SQL TOP

SELECT a.album_name, a.album_id, p.* 
FROM albums a
INNER JOIN album_photos ap ON 
   ap.photo_id = (select photo_id from album_photos where a.album_id = ap.album_id order by photo_id LIMIT 0, 5)
INNER JOIN photos p ON ap.photo_id = p.photo_id