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がその人のFACEBOOKIDと等しいかどうかをチェックする必要があります。(messages_toテーブルには、各メッセージIDの受信者が格納されていることに注意してください)
  • しかし、等しいかどうかをmessages.type = 'main'チェックする場合messages_to.user_idperson'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 に答える