Ja, OR
är ofta en prestationsdödare. En vanlig lösning är att göra UNION
. För ditt exempel:
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');
Om du är säker på att det inte finns dups, byt till den snabbare UNION ALL
.
Om du inte fiskar efter saknade team_users
rader, använd JOIN
istället för LEFT JOIN
.
Om du behöver ORDER BY
, lägg till några föräldrar:
( SELECT ... )
UNION ...
( SELECT ... )
ORDER BY ...
Annars visas ORDER BY
skulle endast gälla för den andra SELECT
. (Om du också behöver 'paginering', se min blogg
.)
Observera att du kanske också behöver LIMIT
under vissa omständigheter.