Объединение 3 трех столов

У меня есть эта диаграмма, которая должна объяснить мою ситуацию. Мне нужна помощь в объединении 3 таблиц, о которых я понятия не имею, как это сделать:

введите здесь описание изображения

Итак, я могу пройти через цикл получения записей, выполнив следующее:

<img src="<?php echo $row['filename']; ?>" alt="" />

Album: <?php echo $row['album_name']; ?> 
AlbumID: <?php echo $row['album_id']; ?>

person MacMac    schedule 22.03.2011    source источник
comment
Вы спрашиваете о синтаксисе SQL или совете о том, является ли объединение правильной операцией, или что?   -  person Pops    schedule 22.03.2011
comment
Синтаксис SQL полезен, так как я могу объединить 2 таблицы одновременно. Но 3 - это то, что я не могу сделать. Это не домашнее задание для тех, кто повторно пометил мой вопрос.   -  person MacMac    schedule 22.03.2011


Ответы (4)


Использование ВНУТРЕННЕГО СОЕДИНЕНИЯ предотвратит возврат альбомов, в которых нет изображений. ORDER BY ... DESC отсортирует результаты в порядке убывания, но я не уверен, как вернуть только последнюю запись. Потребуется какая-то комбинация ORDER BY, GROUP BY и TOP, возможно.

SELECT 
    album_table.album_id, 
    album_table.album_name, 
    images_table.filename
FROM album_table
INNER JOIN images_table ON images_table.album_id = album_table.album_id
WHERE album_table.user_id = uid
ORDER BY images_table.date DESC
person b3.    schedule 22.03.2011
comment
@markus: я хотел написать INNER JOIN! (отредактировано, чтобы исправить это). ЛЕВОЕ СОЕДИНЕНИЕ было бы полезно для возврата альбомов, даже если нет связанного изображения. - person b3.; 22.03.2011
comment
Это синтаксис SQL, который я искал. Спасибо! - person MacMac; 22.03.2011
comment
@lolwut: Если вы разобрались с синтаксисом для возврата только последнего изображения, сообщите нам об этом. - person b3.; 22.03.2011
comment
Синтаксис работает идеально, даже если альбому не назначено изображение, он вернет NULL, которое можно заменить фиктивным изображением. Но это здорово. :) - person MacMac; 22.03.2011
comment
Я также хотел бы сказать, что если вы добавите GROUP BY album_table.album_id, это предотвратит дубликаты, поскольку я только что сталкивался с дубликатами, связанными с album_id, поэтому использование GROUP BY уменьшит количество дубликатов по моему опыту. - person MacMac; 25.03.2011

Я считаю, что INNER JOIN это то, что вы ищете

Этот сайт дает хороший пример

http://www.w3schools.com/sql/sql_join_inner.asp

person Adam Casey    schedule 22.03.2011
comment
многие люди в Stack Overflow не любят w3schools, я узнал это на собственном горьком опыте. - person Ryan Leonard; 22.03.2011
comment
Да, я в курсе. Это не лучший источник, однако для многих простых вещей он предоставляет легко читаемые примеры. Я думаю, что самая большая проблема с w3schools — это устаревшие разделы HTML/CSS, а не страница MySQL. - person Adam Casey; 22.03.2011

@lolwut: попробуй --

SELECT 
  album_table.album_id, album_table.album_name, images_table.filename 
FROM album_table 
  INNER JOIN images_table ON images_table.album_id = album_table.album_id
  INNER JOIN users_table ON users_table.uid = album_table.user_id
WHERE (users_table.uid = ' . $uid . ') 
ORDER BY images_table.date DESC

$uid должен быть текущим сеансом пользователя, вошедшего в систему... или вы можете полностью исключить это предложение WHERE, если хотите вернуть информацию обо всех пользователях.

person stealthyninja    schedule 22.03.2011

На самом деле, в этом случае вам нужно только соединить две таблицы (как правило, чем меньше соединений вы делаете, тем лучше).

Поскольку вы знаете идентификатор пользователя, вы можете запросить его непосредственно из имени таблицы альбома.

Если в вашей таблице users_table есть другой столбец «user_name», и вы хотите найти его, вам нужно будет присоединиться к таблице пользователей.

SELECT filename, album_name, album_id
FROM album_table at, images_table it
AND at.album_id = it.album_id
AND at.user_id = $user_id
person kjl    schedule 22.03.2011
comment
Почему вы пишете свой запрос без явного соединения? - person markus; 22.03.2011