0

メッセージング機能について 2 つの表をたどりました -

message2_recipsテーブル:

mid seq uid status
1   1   1   N
1   1   503 A

およびmessage2テーブル

mid seq created_on           created_on_ip  created_by  body
1   1   2013-08-08 19:17:44   1.2.2.1       503          some_random_text

私はこのクエリを発射しています -

SELECT m.mid, m.seq, m.created_ON, m.created_by, m.body, r.status 
        FROM message2_recips r
INNER JOIN message2 m ON m.mid=r.mid AND m.seq=r.seq 
WHERE r.uid=503 AND r.status in ('A', 'N') AND r.seq=(SELECT max(rr.seq) 
        FROM message2_recips rr 
WHERE rr.mid=m.mid AND rr.status in ('A', 'N')) AND IF (m.seq=1 AND m.created_by=503, 1=0, 1=1)
ORDER BY created_ON DESC

期待される結果は -

mid seq created_on                  created_by  body                status
1   1   2013-08-08 19:17:44          503        some_random_text    A

しかし、それはゼロの結果を返します

しかしif、クエリから条件を削除するIF (m.seq=1 AND m.created_by=503, 1=0, 1=1)と、正しい結果が得られます。message2ただし、テーブル内のデータを観察した後のクエリの条件は満たされ、機能するはずです。

考えられる理由がわかりません。何がうまくいかないか、どのように修正するかについての指針は非常に役に立ちます。


上記のクエリは次のようになります。

現在のユーザーが発信/受信した会話を取得し、他のテーブルからメッセージ コンテンツを取得します。または以外のステータスのメッセージを取得しDeleteます。最大シーケンス番号を持つ最新のメッセージで会話をフィルタリングします。各メッセージには、ファッションの増加に伴い独自のシーケンス番号があります。ActiveNew

これは機能しますが、これはメッセージングの受信トレイ機能のためであるため、ユーザーが自分で開始した会話を見ることができるようにしたいと考えています。現在、上記のクエリが適切に機能していないため、他のユーザーから返信を受け取った後にのみ、彼が開始した会話を見ることができます。

4

1 に答える 1

2

期待される結果は の基準と一致しますIF:

IF (m.seq=1 AND m.created_by=503, 1=0, 1=1)

したがって、上記の式は1=0which が false であるため、行は無視されます。

これを WHERE 句に単純に追加すると、より読みやすくなります。

AND NOT (m.seq=1 AND m.created_by=503)

NOT元の IF が true になることを意図していた場合は、削除します。

于 2013-08-08T15:07:25.360 に答える