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.