Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > объединить два запроса в один


Автор: smilemf 12.7.2008, 14:48
Здраствуйте. 

Значит надобно вывести комментарии вместе с инфой о юзере если он зареган в базе.

есть таблица comments со столбцами commentID,  comment_author, comment_date, comment_content, user_id 
и таблица users с полями userID, userLogin итд.

comments.user_id  = users.userID

Задача такая:

ЕСЛИ comments.user_id  = 0 (это значит что юзер который оставил комментарий не был авторизирован либо зарегистрирован на сайте т.е. в таблице users отсутствуют данные о  нём) ВЫБИРАЕМ ТОЛЬКО столбцы commentID,  comment_author, comment_date, comment_content ИЗ ТАБЛИЦЫ comments


НО ЕСЛИ user_id != 0 (т.е. юзер авторизирован на сайте и значит данные о нём есть в таблице users) ВЫБИРАЕМ столбцы comments.commentID,  comments.comment_date, comments.comment_content, users.userID, users.userLogin ИЗ ТАБЛИЦЫ comments и users ГДЕ comments.user_id= users.userID

вот это всё надо уместить в один запрос.

Автор: skyboy 12.7.2008, 15:05
используй http://dev.mysql.com/doc/refman/5.0/en/union.html, который соединить два запроса в один.

Автор: smilemf 12.7.2008, 15:10
skyboy пробовал так 


Код

SELECT comments.comment_id, comments.comment_date, comments.comment_content, users.ID,
 users.user_login, users.user_group, 
 users.comments_number, users.links_number, users.posts_number 
FROM comments, users 
WHERE comments.user_id <> 0 
UNION 
SELECT comment_id, comment_date, comment_content 
FROM comments 
WHERE user_id = 0


пишет ERROR #1222 : The used SELECT statements have a different number of columns

Автор: Kesh 12.7.2008, 15:10
Сделайте через Join для всех полей сразу (то есть select по постам + join из пользователей)... Для постов с неавторизованными пользователями получите NULL... А все остальное делается через обработку вывода...

Добавлено через 6 минут и 36 секунд
Sorry, не простой JOIN, а LEFT JOIN

Добавлено через 7 минут и 10 секунд
Что-то типа 
Код

SELECT * FROM posts p LEFT JOIN authors a ON p.author_id = a.author_id;

Автор: Kesh 12.7.2008, 15:37
smilemf, ну чего замолчал? помогло?

Автор: skyboy 12.7.2008, 15:44
smilemf, ну что же ты :(
пишет: "запросы SELECT должны возвращать одинаковое количество полей". разве не логично?
результат запроса - таблица по виду. как может таблица быть "лесенкой": тут два поля, а тут - двадцать два?
тебе в одном из запросов не нужны поля, а во втором - должны быть, то вместо полей можешь выводить пустые строки или вообще любые значение.
к примеру, так:
Код

SELECT 1111,'',''
FROM `dual`
UNION
SELECT 2222,3333,4444
FROM `dual`

но тебе, возможно, придется отличать строки одного подзапроса от строк другого. тогда добавь ещё поле с константным значением:
Код

SELECT 1111,'','','тут только одно поле надо' 
FROM `dual`
UNION
SELECT 2222,3333,4444,'тут нужны все поля' 
FROM `dual`

и потом. у тебя подзапрос 
Код

SELECT comments.comment_id, comments.comment_date, comments.comment_content, users.ID,
   users.user_login, users.user_group,users.comments_number, users.links_number, 
   users.posts_number 
FROM comments, users 
WHERE comments.user_id <> 0

не соответствует условию
Цитата(smilemf @  12.7.2008,  13:48 Найти цитируемый пост)
comments.user_id  = users.userID

что такое декартово произведение знаешь? у тебя твой запрос формирует все возможные сочетания каждой записи из comments с каждой записью из users.
и потом, когда размещаешь такие длинные запросы - окажи уважение к читающим и отформатируй запрос так, чтоб глаза не ломались. про enter знаем? а про пробел? вот и форматируй так(переносы и отступы), чтоб сходу можно было видеть - что откуда ты берешь.

Автор: smilemf 12.7.2008, 17:19
решил проблему через LEFT JOIN благодаря совету юзера Kesh. smile

skyboy, я изучать mysql начал совсем недавно поэтому и допускаю пока такие глупые ошибки, к тому-же ранее не приходилось работать с этой функцией. Спасибо за объяснение насчёт UNION - теперь буду знать smile 


Всем спасибо!   smile 

Автор: Kesh 12.7.2008, 18:03
skyboy, грузишь новичка теорией smile
Не всех же "драли" на зачетах по БД как нас с тобой smile
Люди могут и не знать, что такое декартово произведение...

Автор: skyboy 12.7.2008, 18:11
smilemf, не правдывайся,  я же не препод  smile 
просто я правда не могу понять, как ты ожидал получить результат с разным количеством полей(столбцов) в разных записях(строках) smile

Автор: Kesh 12.7.2008, 18:26
Цитата(skyboy @ 12.7.2008,  18:11)
smilemf, не правдывайся,  я же не препод  smile 
просто я правда не могу понять, как ты ожидал получить результат с разным количеством полей(столбцов) в разных записях(строках) smile

А тут на самом деле фишка в другом... Я только недавно (когда стал работать в немецкой конторе) стал понимать, что пользователь объясняет задание всегда  с точки зрения конечного результата, т.н. Fachkonzept...
После этого надо преобразовать его требования к нормальному виду (Technisches Konzept), решить задачу, и объяснить клиенту, что именно это он и хотел получить...
В этом случае вопрос был задан из соображений "хочу чтобы выводились определенные поля при определенных условиях" - это Fachkonzept. На самом же деле smilemf не особо важно было как именно это будет реализовано в SELECT... Ему просто нужна была маленькая подсказка, как получить нужные данные для обработки (например в php-скрипте)... А потом он уже и сам дойдет, как это потом все "еще более конечному" пользователю выдать... ВОт за это в немецких конторах и платят большие деньги... smile Эх - когда-нибудь научусь, и...

P.S. Крик души... Лежит на столе Fachkonzept на 250+ страниц... надо перевести его в Techn. Konzept, а так влом... (начал HL-2 перепроходить smile )

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)