Объяснение запроса на присоединение - PullRequest
0 голосов
/ 19 июля 2011

У меня есть следующий запрос на присоединение для возврата пользователей, на которых подписан пользователь. Таблица users состоит из данных пользователя, а таблица subscriptions содержит user_id и идентификатор пользователя, на которого она / он подписан в столбце following.

SELECT  subscriptions.following, users.first_name, last_name 
FROM (
subscriptions
)
JOIN users ON  users.user_id =  subscriptions.following
WHERE  subscriptions.user_id = 62
ORDER BY subscribed DESC 
LIMIT 0 , 30

Я получаю следующую структуру таблицы

+-----------+-------------+------------+
| following | first_name  | last_name  |
+-----------+-------------+------------+
| 11        | Dave        | Green      |
| 2         | Anna        | Blue       |
+-----------+-------------+------------+

Может кто-нибудь подтвердить, если мой запрос правильный? Я не понимаю в запросах на соединение, почему я должен указывать FROM, когда я уже говорю, какие таблицы я использую в части SELECT.

Примечание: Запрос работает. Я просто не уверен, есть ли лучший способ сделать это.

Ответы [ 2 ]

2 голосов
/ 19 июля 2011

Вы должны понимать, что базы данных не работают напрямую через запрос сверху вниз.Он не может выполнять часть SELECT до тех пор, пока не обработает объединение и предложение where, а также любые группы по предложениям и т. Д. Вам также не нужно фактически иметь данные из каждой таблицы, объединенной в SELECT.Например, вам может потребоваться список пользователей, которые являются сотрудниками (в отличие от клиентов).Поэтому вам не нужно ничего, кроме того, что находится в пользовательской таблице, и вы используете соединение просто для того, чтобы сократить набор записей только до тех, которые также есть в таблице сотрудников.Нет необходимости выбирать какие-либо поля из таблицы сотрудников.База данных также не будет знать, пока вы не дойдете до объединений, как вы хотите, чтобы данные были объединены.Вы получили бы разные записи для этих условий соединения в одной и той же таблице:

FROM subscriptions 
JOIN users ON users.user_id =  subscriptions.following 

FROM subscriptions 
left JOIN users ON users.user_id =  subscriptions.following 

FROM subscriptions 
CROSS JOIN users

FROM subscriptions 
JOIN users ON users.referred by_id =  subscriptions.following 

Первая выдаст вам записи, которые находятся в обеих таблицах.

Второй даст вам записи, которые находятся в первой таблице, но не обязательно во второй таблице.В зависимости от данных это может быть одинаковое количество записей или это может быть существенно различное количество записей.

Третий будет сопоставлять все записи в первой таблице со всеми записями во второй таблице.

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

Надеюсь, вы можете видеть изобъяснение, почему вам нужно указать соединение в предложении FROM.

0 голосов
/ 19 июля 2011

Проверьте следующее.- Ваш запрос также хорошо.

SELECT  subscriptions.following, users.first_name, users.last_name 
FROM subscriptions
JOIN users ON users.user_id =  subscriptions.following AND subscriptions.user_id = 62
ORDER BY subscribed DESC 
LIMIT 0 , 30

1.подписки рядом с выберите, чтобы указать поля родительской таблицы.например, если в обеих таблицах указано одинаковое имя поля, для ссылки используется родительское имя.

2.Где нет необходимости, если вы проверяете со статическим значением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...