Да, OR
често е убиец на представянето. Често срещано решение е да направите UNION
. За вашия пример:
SELECT *
FROM `posts`
LEFT JOIN `teams_users`
ON (teams_users.team_id=posts.team_id
AND teams_users.user_id='7135')
WHERE (teams_users.status='1')
UNION DISTINCT
SELECT *
FROM `posts`
LEFT JOIN `teams_users`
ON (teams_users.team_id=posts.team_id
AND teams_users.user_id='7135')
WHERE (posts.user_id='7135');
Ако сте сигурни, че няма дублиране, променете на по-бързия UNION ALL
.
Ако не търсите липсващи team_users
редове, използвайте JOIN
вместо LEFT JOIN
.
Ако имате нужда от ORDER BY
, добавете няколко скоби:
( SELECT ... )
UNION ...
( SELECT ... )
ORDER BY ...
В противен случай ORDER BY
ще се прилага само за втория SELECT
. (Ако имате нужда и от „пагиниране“, вижте моя блог
.)
Моля, имайте предвид, че може да се нуждаете и от LIMIT
при определени обстоятелства.