Выберите несколько элементов, связанных с одним элементом - PullRequest
0 голосов
/ 27 декабря 2011

Я чувствую, что есть лучший способ сделать это.В основном я просто спрашиваю, правильно ли я делаю, или есть намного лучший способ.

Обратите внимание на эти таблицы:

Users
id | name
---+---------
 1 | Andrew
 2 | Greg

Images
id | userid | url
---+--------+-------
 1 |   1    |  img/foo.jpg
 2 |   2    |  img/bar.jpg
 3 |   2    |  img/baz.jpg
 4 |   1    |  img/qux.jpg

Если в таблице Users был один иностранныйключ, который ссылается на изображения, каждый пользователь может быть связан только с одним изображением.Тем не менее, я хотел бы разрешить каждому пользователю быть связанным с любым количеством изображений, следовательно, вместо этого добавив внешний ключ пользователя в изображения.

Я понимаю, как использовать JOIN, если у пользователя есть один внешний ключ к данным, хранящимся в другой таблице.Однако в этом случае есть еще одна таблица с рядом внешних ключей, связанных с интересующим меня пользователем. Как мне создать запрос SELECT, который будет получать все изображения, связанные с пользователем, в дополнение ко всемданные, связанные с пользователем (тип пользователя, номер телефона, бла-бла-бла [я уже знаю, как это сделать]) в одном запросе SELECT?

Или есть ли лучший способ сделать это?

Редактировать 1:

Например, если вы выберете пользователя с id = 1, он вернет первую строку Users, а также первую и последнюю строку Images (поскольку эти строки имеют userid = 1).

Ответы [ 2 ]

2 голосов
/ 27 декабря 2011

Если вам не нужны несколько строк с одинаковыми (пользовательскими) данными, вы можете сгруппировать данные по каждому пользователю и использовать функцию GROUP_CONCAT(), чтобы собрать все URL-адреса в одном столбце:

SELECT u.*
     , GROUP_CONCAT(i.URL)
FROM users u
  LEFT JOIN Images i 
    ON u.ID = i.userID
WHERE u.ID = 1
GROUP BY u.ID

или используйте 2 запроса:

SELECT u.*
FROM users u
WHERE u.ID = 1

SELECT i.URL
FROM Images i 
WHERE i.userID = 1
1 голос
/ 27 декабря 2011

Итак ... Если это 1-1 или 1-М, то соединение одинаковое.Отклонения вступают в игру, когда вы хотите, чтобы все одно, где значения не существуют в другом, или вы хотите, чтобы все оба, независимо от того, найдены ли совпадения.Один из моих любимых сайтов, объясняющих логику объединения SQL, - код ужаса

Select U.Name, I.URL
FROM users U 
INNER JOIN Images I ON U.ID = I.userID
Where U.ID = 1

вернет

U.Name  I.URL
Andrew  img/foo.jpg
Andrew  img/Qux.jpg

РЕДАКТИРОВАТЬ Итак, что вы послеА

U.Name  I.URL
Andrew  img/foo.jpg
        img/Qux.jpg   

ИЛИ Б?

U.Name  I.URL
Andrew  img/foo.jp, img/Qux.jpg
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...