SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 03.02.2010 19:52:23

alexxx
Участник
Зарегистрирован: 03.02.2010
Сообщений: 11

Как более правильно составить запрос?

1 вариант
SELECT a.Message, CONCAT(b.FirstName,' ',b.LastName) as UserName FROM forum_messages as a, users as b WHERE a.UserId=b.UserId AND a.TopicId=1

2вариант
SELECT a.Message, CONCAT(b.FirstName,' ',b.LastName) as UserName FROM forum_messages as a LEFT JOIN users as b ON (a.UserId=b.UserId) WHERE a.TopicId=1

Результат выполнения обоих запросов одинаков, но как правильнее?

Неактивен

 

#2 03.02.2010 20:09:30

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Как более правильно составить запрос?

Первый правильно, так как второй ещё ищет строки не имеющие соответствия во второй таблице, которых в вашем случае заведомо нет.
А ещё лучше переписать первый запрос через JOIN (запятая и join являются синонимами), т.е. второй запрос без слова LEFT. Скобки, кстати, в нем лишние.

Неактивен

 

#3 03.02.2010 20:57:44

alexxx
Участник
Зарегистрирован: 03.02.2010
Сообщений: 11

Re: Как более правильно составить запрос?

Простите, а что значит "второй ещё ищет строки не имеющие соответствия во второй таблице"?

Неактивен

 

#4 03.02.2010 21:12:55

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Как более правильно составить запрос?

Пусть у вас есть таблица юзеров и таблица постов. Вы хотите найти тех юзеров, у которых нет ни одного поста. Просто JOIN покажет только тех пользователей, у которых есть сообщения, а LEFT JOIN также и тех, у кого нет ни одного сообщения.

LEFT JOIN в вашем втором примере ищет те сообщения у которых нет автора. Что заведомо невозможно.

Неактивен

 

#5 03.02.2010 21:18:18

alexxx
Участник
Зарегистрирован: 03.02.2010
Сообщений: 11

Re: Как более правильно составить запрос?

Я хочу чтобы запрос вернул имя пользователя для каждого поста
Мне так же не понятно почему LEFT JOIN вернет так же строки не соответствующие условию ON

Отредактированно alexxx (03.02.2010 21:19:48)

Неактивен

 

#6 03.02.2010 21:36:34

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Как более правильно составить запрос?

alexxx написал:

Я хочу чтобы запрос вернул имя пользователя для каждого поста

Так ваш запрос именно это и делает.

alexxx написал:

Мне так же не понятно почему LEFT JOIN вернет так же строки не соответствующие условию ON

Вы путаете: "не соответствующие условию" не равно "не имеющие соответствия" (о чем писал я).

В вашем первом примере (forum_messages as a, users as b) из таблицы forum_messages выбираются те строки, которые имеют соответствие в таблице users (a.UserId=b.UserId), т.е. имеют автора.

Во втором примере (forum_messages as a LEFT JOIN users) из таблицы forum_messages выбираются все строки и для тех которые имеют соответствие в таблице users (a.UserId=b.UserId) будет указан автор, а для тех у которых такого соответствия нет в столбце автор будет стоят null.

Так как у вас все посты имеют автора, то вы и не видите разницы в выполнении этих запросов.

Неактивен

 

#7 03.02.2010 21:51:50

alexxx
Участник
Зарегистрирован: 03.02.2010
Сообщений: 11

Re: Как более правильно составить запрос?

Понятно. Спасибо
Хотя все-таки второй запрос получается разумнее использовать. Мало ли какой-то пользователь будет удален и тогда его сообщение на форуме перестанет отображаться.

Отредактированно alexxx (03.02.2010 22:09:51)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson