Я работаю с PHP и PDO, и мне нужно переосмыслить информацию, объединяющую 3 таблицы:
Таблица имеет следующую структуру:
фото:
photo_id (int) path (varchar) nick (varchar) date (timestamp)
альбомы
album_id (int) album_name (varchar) nick (varchar) date (timestamp)
album_photos
album_id (int) photo_id (int) nick (varchar) date (timestamp)
Итак, я хочу показать все альбомы с максимальным количеством 5 фотографий для каждого, где пользовательский ник является «владельцем» .
Чтобы показать следующее:
album_name_1: [photo_1] [photo_2] [photo_3] [photo_4] [photo_5] album_name_2: [photo_1] [photo_2] [photo_3] [photo_4] [photo_5]
Я знаю только, что что-то подобное можно сделать с помощью INNER JOIN, но я не могу найти, как я могу сделать это с 3 таблицами.
Есть примеры или другая помощь, которую я могу сделать для этого?
SELECT a.*, c.date FROM Album a INNER JOIN Album_Photo b ON a.Album_ID = b.Album_ID INNER JOIN Photo c ON b.Photo_ID = c.Photo_ID WHERE c.Nick = 'owner' AND ( SELECT COUNT(*) FROM album_photo d WHERE b.album_id = d.album_id AND d.nick = 'owner' AND b.date >= d.date ) <= 2 // <<== change this value to 5
Я думаю, что это можно решить, используя хранимые процедуры. Используя переменные и циклы , вы можете получить нужные записи. Получение только максимум 5 записей из альбома довольно сложно, когда вы используете только основные команды SQL. Иногда вы не можете получить правильные записи. Я предлагаю вам использовать Stored Proc. 🙂
Попробуйте
"SELECT albums.*,photos.id,photos.path,photo_date as Pht_date FROM albums JOIN album_photos ON album_photos.album_id = albums.album_id JOIN photos ON photos.photos_id = album_photos_id "
Но вы продолжаете давать индивидуальный лимит для фотографий, где он участвует в «JOIN», вам нужно дать индивидуально, как
$album_ids = "SELECT album_id FROM albums";
то для фотографий вам нужно написать запрос liks
"SELECT photos.* FROM photos WHERE album_photos.album_id in (".$album_ids.") AND album_photos.nick = 'owner' JOIN album_photos ON album_photos.photo_id = photos.photos_id LIMIT 0,10 "