Sì, OR
è spesso un killer di prestazioni. Una soluzione comune è eseguire UNION
. Per il tuo esempio:
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');
Se sei sicuro che non ci siano duplicati, passa al più veloce UNION ALL
.
Se non stai cercando team_users
mancanti righe, usa JOIN
invece di LEFT JOIN
.
Se hai bisogno di ORDER BY
, aggiungi alcune parentesi:
( SELECT ... )
UNION ...
( SELECT ... )
ORDER BY ...
Altrimenti, il ORDER BY
si applicherebbe solo al secondo SELECT
. (Se hai bisogno anche di 'impaginazione', vedi il mio blog
.)
Tieni presente che potresti anche aver bisogno di LIMIT
in determinate circostanze.