此查询适用于大多数服务器,但与其他服务器不兼容。它会导致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次查询,但肯定有一种方法可以通过单个查询来完成。
答案 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