6

我有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 ID。(请注意,messages_to 表存储每个消息 ID 的收件人)
  • 但是如果messages.type = 'main'检查是否messages_to.user_id等于person's USER ID (USER.id)

是否有可能mysql join query有效地做到这一点?

messages_tos 表存储了 MESSAGES 表中每条消息的所有收件人。消息的接收者可能不止一个。

4

2 回答 2

2

我想这是查询。

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')  
于 2011-08-05T16:14:16.483 回答
1

类似的东西?

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

为什么你把你的messagesmessages_to表分开而不使用一个表呢?(我假设一个 1:1 的关系)

于 2011-08-05T16:11:05.790 回答