| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 пробовал так
пишет 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 секунд Что-то типа
|
| Автор: Kesh 12.7.2008, 15:37 |
| smilemf, ну чего замолчал? помогло? |
| Автор: skyboy 12.7.2008, 15:44 | ||||||
| smilemf, ну что же ты :( пишет: "запросы SELECT должны возвращать одинаковое количество полей". разве не логично? результат запроса - таблица по виду. как может таблица быть "лесенкой": тут два поля, а тут - двадцать два? тебе в одном из запросов не нужны поля, а во втором - должны быть, то вместо полей можешь выводить пустые строки или вообще любые значение. к примеру, так:
но тебе, возможно, придется отличать строки одного подзапроса от строк другого. тогда добавь ещё поле с константным значением:
и потом. у тебя подзапрос
не соответствует условию что такое декартово произведение знаешь? у тебя твой запрос формирует все возможные сочетания каждой записи из comments с каждой записью из users. и потом, когда размещаешь такие длинные запросы - окажи уважение к читающим и отформатируй запрос так, чтоб глаза не ломались. про enter знаем? а про пробел? вот и форматируй так(переносы и отступы), чтоб сходу можно было видеть - что откуда ты берешь. |
| Автор: smilemf 12.7.2008, 17:19 |
| решил проблему через LEFT JOIN благодаря совету юзера Kesh. skyboy, я изучать mysql начал совсем недавно поэтому и допускаю пока такие глупые ошибки, к тому-же ранее не приходилось работать с этой функцией. Спасибо за объяснение насчёт UNION - теперь буду знать Всем спасибо! |
| Автор: Kesh 12.7.2008, 18:03 |
| skyboy, грузишь новичка теорией Не всех же "драли" на зачетах по БД как нас с тобой Люди могут и не знать, что такое декартово произведение... |
| Автор: skyboy 12.7.2008, 18:11 |
| smilemf, не правдывайся, я же не препод просто я правда не могу понять, как ты ожидал получить результат с разным количеством полей(столбцов) в разных записях(строках) |
| Автор: Kesh 12.7.2008, 18:26 | ||
А тут на самом деле фишка в другом... Я только недавно (когда стал работать в немецкой конторе) стал понимать, что пользователь объясняет задание всегда с точки зрения конечного результата, т.н. Fachkonzept... После этого надо преобразовать его требования к нормальному виду (Technisches Konzept), решить задачу, и объяснить клиенту, что именно это он и хотел получить... В этом случае вопрос был задан из соображений "хочу чтобы выводились определенные поля при определенных условиях" - это Fachkonzept. На самом же деле smilemf не особо важно было как именно это будет реализовано в SELECT... Ему просто нужна была маленькая подсказка, как получить нужные данные для обработки (например в php-скрипте)... А потом он уже и сам дойдет, как это потом все "еще более конечному" пользователю выдать... ВОт за это в немецких конторах и платят большие деньги... P.S. Крик души... Лежит на столе Fachkonzept на 250+ страниц... надо перевести его в Techn. Konzept, а так влом... (начал HL-2 перепроходить |