тройной select

Аватара пользователя
E-mail

тройной select

Сообщение E-mail »

есть три таблицы:



====

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

Re: тройной select

Сообщение E-mail »

ну мы уже ведь разделил таблице 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+

если надо могу посмотреть более точно версиюИзображение



ай, памажите с запросом..
Аватара пользователя
E-mail

Re: тройной select

Сообщение E-mail »

дело в том что таблица guest будет очищаться по крону, ведь незачем хранить имена гостей, если они больше незайдут - они ведь не зарегины?



иссправил как ты написал:





Код:

Код: Выделить всё

message.user_id	=	'1' AND 
(user.id	=	message.for_user_id OR 
guest.id	=	message.for_guest_id)

выводит совершенно не то..



даже менял местами:





Код:

Код: Выделить всё

message.user_id	=	'1' AND 
(message.for_user_id = user.id OR 
message.for_guest_id = guest.id)

все равно не то выводится(кстати как правильно раставлять местами?)



вот как могут выглядеть кортежи в таблице 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...
Аватара пользователя
vadimiron

Re: тройной select

Сообщение vadimiron »

E-mail

Мне кажется соевершенно не надо разделять user и guest, это же одно и тоже, только разные права у них



С AND ищется и message.for_user_id равный user.id, и message.for_guest_id равный guest.id, то есть строки, где эти оба равенства совпадают, а ты сам сказал, что такого не бывает



Можно попробывать с OR, чтото типа этого



Код:

Код: Выделить всё

WHERE 
message.guest_id = '1' AND 
(user.id = message.for_user_id OR
guest.id = message.for_guest_id)

Но не знаю, будет ли работать, так как схему таблиц не очень пойму
Аватара пользователя
vadimiron

Re: тройной select

Сообщение vadimiron »

Не, для меня это всё равно выглядит неправильным, я бы сделал одну таблицу юзер и там поле, типа status, в которое уже записывал бы guest or registered, короче чтото в этом духе.

Можно попробывать ещё UNION по двум запросам

Чтото типа

(SELECT user tralalala) UNION (SELECT guest tralalala)

tralala это условие, которое нужно (id сообщения или что там ещё было)





Самая большая проблема твоей схемы - это наличие связей внутри одной таблицы, что не дожно быть
Аватара пользователя
E-mail

Re: тройной select

Сообщение E-mail »

vadimiron всмысле наличие связей в одно таблице?

почему проблема, вроде как наличие связей это суть реляции,



а поповоду разделения - это условие нормализации, ну вот внутренний голос предостерегает, говорит что хранить реквизиты юзеров и "бомжей" в одной таблице не безопасноИзображение и ИМХО не логично.. кстати по поводу статусов - они также в другой таблице Изображение



помогите с тройным селектом.... ААА
Аватара пользователя
Prisoner

Re: тройной select

Сообщение Prisoner »

Вадимирон прав, наличие связей (функциональных зависимостей) внутри таблицы для неключевых полей противоречит требованию третьей нормальной формы. А что касается безопасности, то "бомж, админ и Бог" - это лишь значения атрибута "должность", сущности "посетитель". Всяко ведь напрямую к базе никто доступа получать не должен, даже Бог, только Космос т.е. скрипт, неподверженный влиянию параметров переданных всяческими посетителями Изображение
Аватара пользователя
E-mail

Re: тройной select

Сообщение E-mail »

не ну разделить таблицу на две - не проблема:



одна таблица с:



id (unique)

user_id

guest_id

for_user_id

for_guest_id

message_id



а другая с:



id (unique)

message

private

time_send





но всеже, возвращаясь к гланой теме, как построить один запрос к этим - уже четырем таблицам качественно?Изображение



по поводу разделения:

я же говорю у меня таблица пользователей с логином и пасвордом, а вторая с гостей с только именем и отдельная таблица с привилегиями, с помощью таблицы связи происходит одаривание, если объединить пользователя и гостя в одну таблицу, то:



1) гостю нечего записывать в пароль

2) как вы представляете себе авторизацию?

3) нормализация сами говоритеИзображение



помогите мне пожалуйста с запросом..
Аватара пользователя
Igor_I

Re: тройной select

Сообщение Igor_I »

В общем ничего не получается у меня.

В первом запросе ошибка в том, что нет пользователя с номером 0, а ты его сравниваешь
Аватара пользователя
E-mail

Re: тройной select

Сообщение E-mail »

Igor_I у меня тоже в этом проблема,



пробЫвал даже '0'



как делать вложенный селект в том случае если значение отличное от нуля?
Ответить

Вернуться в «Вебмастеру»