2016-11-02 19 views
0

このクエリはほとんどのサーバーでうまく動作しますが、他のものとはうまく機能しません。 CPUの過負荷または空の結果が発生します。MySQL - AND条件の2ブロックでOR条件付きの継手

SELECT 
    M.id, 
    M.sender, 
    M.recipient, 
    M.date, 
    M.read, 
    U.ID 
FROM 
    msg M, 
    users U 
WHERE 
    (M.recipient='".$user_login."' and 
    M.deleted!=1 and 
    U.user_login=M.sender) 
    or 
    (M.sender='".$user_login."' and 
    M.deleted!=2 and 
    U.user_login=M.recipient) 
ORDER BY M.date DESC 

私はこれへの変更が、同じ問題があります:私は問題は2例でjointure句だと思う

SELECT 
    M.id, 
    M.sender, 
    M.recipient, 
    M.date, 
    M.read, 
    U.ID 
FROM 
    msg M 
LEFT JOIN 
    users U 
ON 
    (M.recipient='".$user_login."' and 
    M.deleted!=1 and 
    U.user_login=M.sender) 
    or 
    (M.sender='".$user_login."' and 
    M.deleted!=2 and 
    U.user_login=M.recipient) 
ORDER BY M.date DESC 

を。

"id"と "ID"で大文字と小文字の問題があるとは思わない。

もちろん2つのクエリを作成できますが、確かに1つのクエリでこれを行う方法があります。

+0

クエリをEXPLAINした結果を投稿できますか? – krasipenkov

+0

いいえ、申し訳ありません。これはWordPressプラグインの一部であり、ユーザーはこの問題を報告しますが、デバッグ情報を取得する方法はわかりません。 – Jacques

+1

あなたのデータベースにEXPLAIN SELECT M.id、M.sender ......を実行し、ここに結果を貼り付けてください。 – krasipenkov

答えて

0

JOIN状態のORは恐ろしい考えのように聞こえます。通常、UNIONがより良い解決策になります: -

SELECT 
    M.id, 
    M.sender, 
    M.recipient, 
    M.date AS msg_date, 
    M.read, 
    U.ID 
FROM msg M 
INNER JOIN users U 
ON U.user_login=M.sender 
WHERE M.recipient='".$user_login."' 
AND M.deleted!=1 
UNION 
SELECT 
    M.id, 
    M.sender, 
    M.recipient, 
    M.date AS msg_date, 
    M.read, 
    U.ID 
FROM msg M 
INNER JOIN users U 
ON U.user_login=M.recipient 
WHERE M.sender='".$user_login."' 
AND M.deleted!=2 
ORDER BY msg_date DESC 
+0

空の結果を返します。 ORDERなしでうまく動作しますが、後で注文する必要があります。 – Jacques

+0

@Jacques - それを修正しました(私は注文句にテーブルエイリアスを残しました)。やってみよう。 – Kickstart

+0

ありがとう@Kickstart、うまく動作します。 +1 – Jacques