2011-01-17 7 views
2

私は3つのテーブルを持っています。受信トレイ、送信トレイ、およびメッセージ。MySQLの単一の行に複数のキーがあります

単一のメッセージの場合、データは次のようになります。

メッセージ:

+----------+----------------+ 
|message_id|content   | 
+----------+----------------+ 
|1   |'lorem ipsum...'| 

受信トレイ:

+--------+----------+-----+-------+ 
|inbox_id|message_id|to_id|from_id| 
+--------+----------+-----+-------+ 
|1  |1   |1 |1  | 
|2  |1   |2 |1  | 
|3  |1   |3 |1  | 

送信トレイ:

+---------+----------+-----+-------+ 
|outbox_id|message_id|to_id|from_id| 
+---------+----------+-----+-------+ 
|1  |1   |1,2,3|1  | 

1人のユーザーが複数の人にPMを送ることができます。各受信者に対して、新しい受信トレイレコードが生成されます。

現在、受信者に関係なく1つの送信トレイレコードを生成しています。

PMを送信すると、上記のデータを正確に生成できますが、送信トレイのユーザー名を生成する際に問題が発生しています。

私は送信トレイのためにこれを行うことができるようにしたいと思います(下のクエリは私が達成したいことですが、もちろん動作しません)。

SELECT 
    users.username, 
    messages.message_id, 
    messages.subject 
FROM 
    messages 
JOIN 
    outbox ON outbox.message_id = message.message_id 
JOIN 
    users ON users.user_id IN (outbox.to_id) 
WHERE 
    outbox.from_id = 1 

ている最終的な結果

+-------------------+----------+----------------+ 
|username   |message_id|subject   | 
+-------------------+----------+----------------+ 
|user1, user2, user3|1   |'lorem ipsum...'| 

答えて

4

MySQLのINあなたはそれがないと思うように動作しません。 outbox.to_idは文字列で、users.user_idはintです。 MySQLはto_idをintに変換しようとしていて、 '、'(最初の非int型文字)になると停止します。したがって、 '1,2,3'は '1'に変換されます。

This question私があなたにお手伝いします、受け入れられた答えをお読みください。

「1,2,3」を1つのフィールドに格納する代わりに、電子メールを送信する各ユーザーごとに別々の行があることをお勧めします。

+0

私は答えになるのではないかと心配しました。助けてくれてありがとう! – castis

+0

ええ、1つのフィールドにIDのリストを保存するのは良い方法ではありません。私もそれを学びました。あなたはすることができますが、それは最良の選択肢ではありません。 –

関連する問題