Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру » тройной select

Ответить
Настройки темы
тройной select

Аватара для E-mail

Ветеран


Сообщения: 640
Благодарности: 2

Профиль | Сайт | Отправить PM | Цитировать


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

====
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

не работает..
в чем ошибка?

-------
Основы HTML | Конференции


Отправлено: 14:11, 08-04-2006

 

Аватара для vadimiron

Ветеран


Сообщения: 1864
Благодарности: 120

Профиль | Отправить PM | Цитировать


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)
Но не знаю, будет ли работать, так как схему таблиц не очень пойму

-------
Fortes fortuna adiuvat


Отправлено: 17:05, 08-04-2006 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для E-mail

Ветеран


Сообщения: 640
Благодарности: 2

Профиль | Сайт | Отправить PM | Цитировать


дело в том что таблица 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...

-------
Основы HTML | Конференции


Последний раз редактировалось E-mail, 08-04-2006 в 18:08.


Отправлено: 17:51, 08-04-2006 | #3


Аватара для vadimiron

Ветеран


Сообщения: 1864
Благодарности: 120

Профиль | Отправить PM | Цитировать


Не, для меня это всё равно выглядит неправильным, я бы сделал одну таблицу юзер и там поле, типа status, в которое уже записывал бы guest or registered, короче чтото в этом духе.
Можно попробывать ещё UNION по двум запросам
Чтото типа
(SELECT user tralalala) UNION (SELECT guest tralalala)
tralala это условие, которое нужно (id сообщения или что там ещё было)


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

-------
Fortes fortuna adiuvat


Отправлено: 21:18, 08-04-2006 | #4


Аватара для E-mail

Ветеран


Сообщения: 640
Благодарности: 2

Профиль | Сайт | Отправить PM | Цитировать


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

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

помогите с тройным селектом.... ААА

-------
Основы HTML | Конференции


Отправлено: 22:42, 08-04-2006 | #5


Аватара для Prisoner

Engrossed by the Void


Сообщения: 2229
Благодарности: 60

Профиль | Отправить PM | Цитировать


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

-------
Не могу дать более дельный совет - не хватает системных ресурсов...


Отправлено: 03:53, 09-04-2006 | #6


Аватара для E-mail

Ветеран


Сообщения: 640
Благодарности: 2

Профиль | Сайт | Отправить PM | Цитировать


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

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

id (unique)
user_id
guest_id
for_user_id
for_guest_id
message_id

а другая с:

id (unique)
message
private
time_send


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

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

1) гостю нечего записывать в пароль
2) как вы представляете себе авторизацию?
3) нормализация сами говорите

помогите мне пожалуйста с запросом..

-------
Основы HTML | Конференции


Отправлено: 04:19, 09-04-2006 | #7


Ветеран


Сообщения: 1862
Благодарности: 132

Профиль | Сайт | Отправить PM | Цитировать


В общем ничего не получается у меня.
В первом запросе ошибка в том, что нет пользователя с номером 0, а ты его сравниваешь

-------
ДИЛЕТАНТ - это курьезный человек, который испытывает удовольствие делать то, чего не умеет.
AMD 4200+, MSI Neo2Platinum, 2Gb, ATI 9600, D-Link DWL-G510, FreeBSD 8.0, KDE 4.3.4


Последний раз редактировалось Igor_I, 09-04-2006 в 12:56.


Отправлено: 12:23, 09-04-2006 | #8


Аватара для E-mail

Ветеран


Сообщения: 640
Благодарности: 2

Профиль | Сайт | Отправить PM | Цитировать


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

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

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

-------
Основы HTML | Конференции


Отправлено: 15:45, 09-04-2006 | #9


Ветеран


Сообщения: 1862
Благодарности: 132

Профиль | Сайт | Отправить PM | Цитировать


Видишь ли, мне кажется запрос надо делать какой-то другой.
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)

-------
ДИЛЕТАНТ - это курьезный человек, который испытывает удовольствие делать то, чего не умеет.
AMD 4200+, MSI Neo2Platinum, 2Gb, ATI 9600, D-Link DWL-G510, FreeBSD 8.0, KDE 4.3.4


Отправлено: 18:36, 09-04-2006 | #10



Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру » тройной select

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] элемент select с цифрами dima1981 Вебмастеру 2 11-11-2008 16:34
Динамический Select darksmoke Вебмастеру 1 06-04-2008 22:15
Select с HTML кодом vadimiron Вебмастеру 10 19-02-2007 11:34
Тег <Select> Scorpion666 Вебмастеру 12 25-12-2006 21:46
Вложенный SELECT в MySQL LEXX2002 Вебмастеру 7 06-09-2005 00:07




 
Переход