Оператор внутреннего соединения с ограничением в одной из трех таблиц
Я пытаюсь получить данные из трех таблиц (фото, альбомы, 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 ответа:
Попробуйте изменить предложение
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