сложный запрос соединения - PullRequest
       6

сложный запрос соединения

6 голосов
/ 05 августа 2011

У меня есть таблицы MYSQL следующим образом

user TABLE {id INT}

profile TABLE {user_id INT, facebook_id varchar(50)}

messages TABLE {id INT, message TEXT, from_id INT, type enum('main','facebook'}

messages_to TABLE {user_id varchar(50), message_id INT}

profile.user_id REFERS To user.id
- the messages_to.message_id refers to the messages.ID column.
- the messages_to.user_id refers to profile.user_id IF messages.type = 'main' BUT
  if message_type = 'facebook' THEN messages_to.user_id REFERS to profile.facebook_id

Я хочу сделать запрос на объединение, который в основном выбирает все сообщения для конкретного человека, но дело в том, что messages_to.user_id может ссылаться на the person's facebook ID or the person's ID (a reference to user.id column).

Таким образом, в основном запрос должен работать следующим образом

  • , он должен выбрать все сообщения в таблице сообщений, и если messages.type = 'facebook' проверяет, равен ли messages_to.user_id идентификатор человека FACEBOOK.(обратите внимание, что в таблице messages_to хранятся получатели для каждого идентификатора сообщения)
  • НО, если messages.type = 'main' проверяет, равняется ли messages_to.user_id person's USER ID (USER.id)

Возможно ли это сделатьmysql join query для этого эффективно?

Таблица messages_tos хранит ВСЕХ получателей для каждого сообщения в таблице MESSAGES.МОЖЕТ БЫТЬ БОЛЬШЕ, ЧЕМ ОДИН ПОЛУЧАТЕЛЬ за сообщение.

Ответы [ 2 ]

2 голосов
/ 05 августа 2011

Полагаю, это запрос.

SELECT messages.*,profile.* 
FROM messages 
JOIN messages_to ON messages.id = messages_to.message_id
JOIN profile ON 
  (profile.user_id = messages_to.user_id AND messages.type = 'main') 
  OR (profile.facebook_id = messages_to.user_id AND messages.type = 'facebook')  
1 голос
/ 05 августа 2011

что-то в этом роде?

select m.*, u.*
from messages m
inner join messages_to mt
on m.id = mt.message_id
left join profile p
on    ( m.type = 'facebook' and mt.user_id = p.facebook_id)
   or ( m.type = 'main' and mt.user_id = p.user_id)
left join users u
on p.user_id = u.id

Почему у вас есть таблицы messages и messages_to, и вы не используете для этого одну таблицу?(я предполагаю соотношение 1: 1)

...