Tak, OR jest często zabójcą wydajności. Typowym obejściem jest wykonanie UNION . Na przykład:
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');
Jeśli jesteś pewien, że nie ma duplikatów, zmień na szybsze UNION ALL .
Jeśli nie łapiesz brakujących team_users wierszy, użyj JOIN zamiast LEFT JOIN .
Jeśli potrzebujesz ORDER BY , dodaj kilka nawiasów:
( SELECT ... )
UNION ...
( SELECT ... )
ORDER BY ...
W przeciwnym razie ORDER BY miałby zastosowanie tylko do drugiego SELECT . (Jeśli potrzebujesz również „paginacji”, zobacz mój blog
.)
Pamiętaj, że możesz również potrzebować LIMIT w pewnych okolicznościach.