![]() |
тройной select
есть три таблицы:
==== user: ==== id (unique) name ==== guest ==== id (unique) name ====== message ====== user_id guest_id for_user_id for_guest_id message private time_send в каждом кортеже message может быть либо for_user_id отличный от нуля либо for_guest_id, оба быть не нулями(0) не могут, но могут оба быть нулями. далее мне надо получать сразу имя пользователя кому сообщение: связываюсь с таблицами user и guest запрашиваю все кортежи где guest_id == 1 SELECT user.name, guest.name, message.message, message.private, message.time_send FROM message, user, guest WHERE message.guest_id = '1' AND user.id = message.for_user_id AND guest.id = message.for_guest_id не работает.. в чем ошибка? |
E-mail
Мне кажется соевершенно не надо разделять user и guest, это же одно и тоже, только разные права у них С AND ищется и message.for_user_id равный user.id, и message.for_guest_id равный guest.id, то есть строки, где эти оба равенства совпадают, а ты сам сказал, что такого не бывает Можно попробывать с OR, чтото типа этого Код:
WHERE |
дело в том что таблица guest будет очищаться по крону, ведь незачем хранить имена гостей, если они больше незайдут - они ведь не зарегины?
иссправил как ты написал: Код:
message.user_id = '1' AND даже менял местами: Код:
message.user_id = '1' AND вот как могут выглядеть кортежи в таблице message: ======== структура: ======== user_id guest_id for_user_id for_guest_id message private time_send ====== записи: ====== "1","0","0","0","привет","0","08-04-2006" "0","8","1","0","хаха","0","08-04-2006" "1","0","0","7","хехе","0","08-04-2006" "1","0","0","6","вот это да","0","08-04-2006" соответственно когда приходят сообщения от гостя, то в элементе user_id проставляется значение = 0, а в элементе guest_id проставляется значение айдешника гостя; и наоборот: когда сообщение от пользователя то в элементе user_id проставляется значение айдешника пользователя, а в guest_id значение = 0 то же самое с элементами for_guest_id и for_user_id, если сообщение адресовано гостю, то в for_guest_id пишется айдешник адресата, а в for_user_id записывается значение = 0 .... помогите написать запрос, возвращающий имена вместо айдешников из таблиц user и guest... |
Не, для меня это всё равно выглядит неправильным, я бы сделал одну таблицу юзер и там поле, типа status, в которое уже записывал бы guest or registered, короче чтото в этом духе.
Можно попробывать ещё UNION по двум запросам Чтото типа (SELECT user tralalala) UNION (SELECT guest tralalala) tralala это условие, которое нужно (id сообщения или что там ещё было) Самая большая проблема твоей схемы - это наличие связей внутри одной таблицы, что не дожно быть |
vadimiron всмысле наличие связей в одно таблице?
почему проблема, вроде как наличие связей это суть реляции, а поповоду разделения - это условие нормализации, ну вот внутренний голос предостерегает, говорит что хранить реквизиты юзеров и "бомжей" в одной таблице не безопасно:) и ИМХО не логично.. кстати по поводу статусов - они также в другой таблице ;) помогите с тройным селектом.... ААА |
Вадимирон прав, наличие связей (функциональных зависимостей) внутри таблицы для неключевых полей противоречит требованию третьей нормальной формы. А что касается безопасности, то "бомж, админ и Бог" - это лишь значения атрибута "должность", сущности "посетитель". Всяко ведь напрямую к базе никто доступа получать не должен, даже Бог, только Космос т.е. скрипт, неподверженный влиянию параметров переданных всяческими посетителями :)
|
не ну разделить таблицу на две - не проблема:
одна таблица с: id (unique) user_id guest_id for_user_id for_guest_id message_id а другая с: id (unique) message private time_send но всеже, возвращаясь к гланой теме, как построить один запрос к этим - уже четырем таблицам качественно?:) по поводу разделения: я же говорю у меня таблица пользователей с логином и пасвордом, а вторая с гостей с только именем и отдельная таблица с привилегиями, с помощью таблицы связи происходит одаривание, если объединить пользователя и гостя в одну таблицу, то: 1) гостю нечего записывать в пароль 2) как вы представляете себе авторизацию? 3) нормализация сами говорите;) помогите мне пожалуйста с запросом.. |
В общем ничего не получается у меня.
В первом запросе ошибка в том, что нет пользователя с номером 0, а ты его сравниваешь |
Igor_I у меня тоже в этом проблема,
пробЫвал даже <> '0' как делать вложенный селект в том случае если значение отличное от нуля? |
Видишь ли, мне кажется запрос надо делать какой-то другой.
SELECT user.name, guest.name, message.message, message.private, message.time_send FROM message, user, guest WHERE message.guest_id = '1' AND user.id = message.for_user_id AND guest.id = message.for_guest_id А как здесь message.user_id можно воткнуть? И наверно надо добавить id_message в таблицу, чтобы точно определить сообщение. MySQL какой версии? -- Может еще: + message.guest_id = guest.id SELECT user.name, guest.name, message.message, message.private, message.time_send FROM message, user, guest WHERE message.guest_id = '1' AND message.guest_id = guest.id AND ( user.id = message.for_user_id OR guest.id = message.for_guest_id) |
ну мы уже ведь разделил таблице message на:
======= preferens: ======= id (unique) user_id guest_id for_user_id for_guest_id message_id и ======= message: ======= id (unique) message private time_send т.е. по сути у нас теперь четыри таблицы и требуется четЫрной селект:) MySQL версии 4+ если надо могу посмотреть более точно версию:) ай, памажите с запросом.. |
слушай а чисто тупо не может быть что у тебя одинаковые поля получиутся... ведь user.name, guest.name, в итоге все равно получаються что там что там name если сделать user.name as user_name и guest.name as guest_name просто я вот например чато практикую запрос к 3 и боле тблицам.. (знаю что это не совсем логично но просто так привык) и как то ни каких особенно проблем не возникало...
|
Prisoner то условие ради которого разделили таблицу мессаж от связей называется на самом деле второй, а не третьей нормальной формой:)
проблему на самом деле решил.. как всегда сам, двумя способами.. уж незнаю радоваться мне от этого или нет, незнаю. сам по себе пример содержал в себе несоблюдение условия третьей нормальной формы, а об этом никто не сказал... всем спасибо:) |
Время: 10:12. |
Время: 10:12.
© OSzone.net 2001-