2

SQL フィドルはこちら: http://sqlfiddle.com/#!2/a2e41/8

いくつかのチェックを行うクエリがあります。列 uidto または uidfrom に特定の値が含まれているかどうか。これは正常に機能しますが、列 hidden1 または hidden2 に特定の値が含まれている場合に除外するとすぐに、クエリはとにかく結果を返します。最初の uidto、uidfrom チェックを実行するとすぐに、何も返されませんが、これは予想どおりです。すべてのチェックを行う方法はありますか?一方が他方を支持して無視されていますか?

何か案は?

編集:

チェックする値を含む列 hidden1 にもかかわらず、これはまだ返されます。

SELECT m.threadid,
m.uidto,
m.uidfrom,
m.type,
m.hidden1,
m.hidden2
FROM messages m
WHERE m.uidto = 1
OR m.uidfrom = 1
AND m.hidden1 <> 1
AND m.hidden2 <> 1
GROUP BY threadid;

これは除外を尊重しているように見えますが、1 を含む uidfrom または uidto のチェックは行いません

SELECT m.threadid,
m.uidto,
m.uidfrom,
m.type,
m.hidden1,
m.hidden2
FROM messages m
WHERE m.hidden1 <> 1
AND m.hidden2 <> 1
GROUP BY threadid;

編集:

いくつかのスレッド ID があり、値が uidto または uidfrom に一致するかどうかを確認し、次にユーザー ID が hidden1 または hidden2 にあるかどうかを確認することで、スレッドに関与する各ユーザー (ユーザーは 2 人しか存在しません) に属するメッセージを取得します。

hidden1 列と hidden2 列の値は、スレッドを非表示にすることを選択したユーザー ID です。

ユーザー 1 が自分のスレッドを削除した場合、ユーザー ID (1) を hidden1 列に入れ、彼には見えないようにしますが、他のユーザーには見えるようにします。スレッドに関与しているユーザー ID 22 がスレッドを削除したい場合、ユーザー ID 22 は hidden2 に入り、どちらもそのスレッドを見ることができなくなります。

メッセージスレッドは、メッセージを送信した人、またはメッセージを受信した人だけが見ることができます。他の誰も関与しません。

4

1 に答える 1

0

このクエリを試して、私に知らせてください。

SELECT   m.threadid,
         m.uidto,
         m.uidfrom,
         m.type,
         m.hidden1,
         m.hidden2

FROM     messages m

WHERE    (m.uidto = 1 OR m.uidfrom = 1)
         AND m.hidden1 <> 1 AND m.hidden2 <> 1

GROUP    BY threadid;

括弧は重要です...それらがなければ、あなたがこれを意味していると仮定します:

WHERE    m.uidto = 1 OR ( m.uidfrom = 1  AND m.hidden1 <> 1 AND m.hidden2 <> 1 )

そして... 演算子の優先順位によって決定されます! それに関する情報を含めるように回答を更新するつもりでしたが、それを非常によくカバーしているこの驚くべき SO 投稿を見つけました: Mysql or/and precedence?


明確にするために: http://sqlfiddle.com/#!2/5f989/26/0

select  ThreadID, 

        Type, 

        UIDto, 
        Hidden1, 

        case when UIDTo is null     and Hidden1 is not null then concat('UserTo (',Hidden1,') is hidden')
             when UIDTo is not null and Hidden1 is null     then concat('UserTo (',UIDTo,') is NOT hidden')
             else  'UserTo ('+UIDto+') status is unknown' end as UIDTo_Status,

        UIDfrom, 
        Hidden2,

        case when UIDFrom is null     and Hidden2 is not null then concat('UserTo (',Hidden2,') is hidden')
             when UIDFrom is not null and Hidden2 is null     then concat('UserTo (',UIDFrom,') is NOT Hidden')
             else  'UserTo ('+UIDfrom+') status is unknown' end as UIDfrom_Status


from    messages
于 2013-11-14T00:02:37.120 に答える