Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> объединить два запроса в один 
:(
    Опции темы
smilemf
Дата 12.7.2008, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 31.12.2007

Репутация: нет
Всего: нет



Здраствуйте. 

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

есть таблица 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

вот это всё надо уместить в один запрос.
PM MAIL   Вверх
skyboy
Дата 12.7.2008, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



используй UNION, который соединить два запроса в один.
PM MAIL   Вверх
smilemf
Дата 12.7.2008, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 31.12.2007

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) skyboy - 12.7.2008, 15:47
PM MAIL   Вверх
Kesh
Дата 12.7.2008, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

Репутация: 15
Всего: 54



Сделайте через 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;



--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
Kesh
Дата 12.7.2008, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

Репутация: 15
Всего: 54



smilemf, ну чего замолчал? помогло?


--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
skyboy
Дата 12.7.2008, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



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 знаем? а про пробел? вот и форматируй так(переносы и отступы), чтоб сходу можно было видеть - что откуда ты берешь.

Это сообщение отредактировал(а) skyboy - 12.7.2008, 15:47
PM MAIL   Вверх
smilemf
Дата 12.7.2008, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 31.12.2007

Репутация: нет
Всего: нет



решил проблему через LEFT JOIN благодаря совету юзера Kesh. smile

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


Всем спасибо!   smile 
PM MAIL   Вверх
Kesh
Дата 12.7.2008, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

Репутация: 15
Всего: 54



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


--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
skyboy
Дата 12.7.2008, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



smilemf, не правдывайся,  я же не препод  smile 
просто я правда не могу понять, как ты ожидал получить результат с разным количеством полей(столбцов) в разных записях(строках) smile
PM MAIL   Вверх
Kesh
Дата 12.7.2008, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

Репутация: 15
Всего: 54



Цитата(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 )



--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0808 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.