1

次のようなデータベース スキーマがあります。

users
USERNAME (PK), SEX
Alex, F
John, M
Troy, M
Matt, M

messages
ID (PK), CREATOR (FK users), DATE_CREATED
1, John, 2012-04-15
2, Troy, 2012-04-16

message_recipients
ID, MESSAGE_ID (FK messages), RECIPIENT (FK users), DATE
1, 1, John, 2012-04-15
2, 1, Troy, 2012-04-15
3, 1, Matt, 2012-04-15
4, 2, Alex, 2012-04-16
4, 2, John, 2012-04-16

課題はこれです。John、Troy、Matt のみを受信者とするメッセージ ID を取得したいと考えています。

これは私のクエリです:

SELECT mr1.MESSAGE_ID
FROM message_recipients mr1, message_recipients mr2
WHERE mr1.MESSAGE_ID = mr2.MESSAGE_ID
  AND mr1.RECIPIENT = mr2.RECIPIENT
  AND mr2.RECIPIENT = 'John'
  AND mr2.RECIPIENT = 'Troy'
  AND mr2.RECIPIENT = 'Matt'

上記の SQL は結果なしを示しています。

このクエリを実行すると:

SELECT mr1.MESSAGE_ID
FROM message_recipients mr1, message_recipients mr2
WHERE mr1.MESSAGE_ID = mr2.MESSAGE_ID
  AND mr1.RECIPIENT_ID = mr2.RECIPIENT_ID
  AND (mr2.RECIPIENT_ID = 'John'
  OR mr2.RECIPIENT_ID = 'Troy'
  OR mr2.RECIPIENT_ID = 'Matt')
GROUP BY mr1.MESSAGE_ID

結果:

MESSAGE_ID
1
2

私が見たいのは結果として1つ(MESSAGE_ID)だけなので、上記の結果は正しくありません。

私は何を間違えましたか?誰かが私を啓発できますか?

どうもありがとう、ジョン

4

3 に答える 3

1

あなたが何を望んでいるのかよくわかりません。しかし、列は 3 つのものであってはなりません。構文のみを使用できINます。このような:

SELECT mr1.MESSAGE_ID
FROM message_recipients mr1, message_recipients mr2
WHERE mr1.MESSAGE_ID = mr2.MESSAGE_ID
  AND mr1.RECIPIENT = mr2.RECIPIENT
  AND mr2.RECIPIENT IN('John','Troy','Matt')

または、次のORような構文:

SELECT mr1.MESSAGE_ID
    FROM message_recipients mr1, message_recipients mr2
    WHERE mr1.MESSAGE_ID = mr2.MESSAGE_ID
      AND mr1.RECIPIENT = mr2.RECIPIENT
      AND 
      (
      mr2.RECIPIENT = 'John'
      OR mr2.RECIPIENT = 'Troy'
      OR mr2.RECIPIENT = 'Matt'
      )

編集

私はまだあなたが何を望んでいるのか分かりません。しかし、次のようなものが必要なようです。

SELECT
    m.ID AS MESSAGE_ID,
    m.CREATOR,
    mr.RECIPIENT,
    mr2.RECIPIENT
FROM
    messages AS m
    LEFT JOIN message_recipients AS mr
        ON m.ID=mr.MESSAGE_ID
        AND mr.RECIPIENT='Troy'
    LEFT JOIN message_recipients AS mr2
        ON m.ID=mr2.MESSAGE_ID
        AND mr2.RECIPIENT='Matt'
WHERE
    m.CREATOR='John'
于 2012-04-17T06:38:16.970 に答える
0

OR代わりに使用する必要があると思いますAND

以下を試してください:

SELECT mr1.MESSAGE_ID
FROM message_recipients mr1 LEFT JOIN message_recipients mr2 
ON mr1.MESSAGE_ID = mr2.MESSAGE_ID
WHERE  mr1.RECIPIENT = mr2.RECIPIENT
  AND ( mr2.RECIPIENT = 'John'
  OR mr2.RECIPIENT = 'Troy'
  OR mr2.RECIPIENT = 'Matt')
于 2012-04-17T06:40:27.817 に答える
0

試してみる-

SELECT mr1.MESSAGE_ID
FROM message_recipients mr1, message_recipients mr2
WHERE mr1.MESSAGE_ID = mr2.MESSAGE_ID
  AND mr1.RECIPIENT = mr2.RECIPIENT
  AND mr2.RECIPIENT = 'John'
  AND mr2.RECIPIENT in ('Troy','Matt')
于 2012-04-17T07:14:47.140 に答える