MySQL - 带AND条件的2区块中的OR条件

时间:2016-11-02 09:24:27

标签: mysql

此查询适用于大多数服务器,但与其他服务器不兼容。它会导致CPU过载或空结果。

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

我已经改变了这个但同样的问题:

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

我认为问题是有2个案例的联合条款。

我不认为" id"可能会出现问题。和" ID"。

当然我可以进行2次查询,但肯定有一种方法可以通过单个查询来完成。

1 个答案:

答案 0 :(得分: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