Да, 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 при определени обстоятелства.