Задавайте вопросы, мы ответим
Вы не зашли.
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
Результат выполнения обоих запросов одинаков, но как правильнее?
Неактивен
Первый правильно, так как второй ещё ищет строки не имеющие соответствия во второй таблице, которых в вашем случае заведомо нет.
А ещё лучше переписать первый запрос через JOIN (запятая и join являются синонимами), т.е. второй запрос без слова LEFT. Скобки, кстати, в нем лишние.
Неактивен
Простите, а что значит "второй ещё ищет строки не имеющие соответствия во второй таблице"?
Неактивен
Пусть у вас есть таблица юзеров и таблица постов. Вы хотите найти тех юзеров, у которых нет ни одного поста. Просто JOIN покажет только тех пользователей, у которых есть сообщения, а LEFT JOIN также и тех, у кого нет ни одного сообщения.
LEFT JOIN в вашем втором примере ищет те сообщения у которых нет автора. Что заведомо невозможно.
Неактивен
Я хочу чтобы запрос вернул имя пользователя для каждого поста
Мне так же не понятно почему LEFT JOIN вернет так же строки не соответствующие условию ON
Отредактированно alexxx (03.02.2010 21:19:48)
Неактивен
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.
Так как у вас все посты имеют автора, то вы и не видите разницы в выполнении этих запросов.
Неактивен
Понятно. Спасибо
Хотя все-таки второй запрос получается разумнее использовать. Мало ли какой-то пользователь будет удален и тогда его сообщение на форуме перестанет отображаться.
Отредактированно alexxx (03.02.2010 22:09:51)
Неактивен