В одном комментарии вы спрашиваете is it generally better to use a subquery or a union
.К сожалению, нет простого ответа, просто некоторая информация.
В некоторых разновидностях SQL возникают проблемы с оптимизацией предложения IN, если lsit велик, и может работать лучше в любом изследующие способы ...
SELECT * FROM tweets
INNER JOIN followers ON tweets.user_id = followers.following_id
WHERE followers.user_id = 1
UNION ALL
SELECT * FROM tweets
WHERE user_id = 1
Или ...
SELECT
*
FROM
tweets
INNER JOIN
(SELECT following_id FROM followers WHERE user_id = 1 UNION SELECT 1) AS followers
ON tweets.user_id = followers.following_id
Или ...
SELECT
*
FROM
tweets
WHERE
EXISTS (SELECT * FROM followers WHERE following_id = tweets.user_id and user_id = 1)
OR user_id = 1
Есть много, много альтернатив ...
Некоторые разновидности SQL пытаются оптимизировать условие OR
и заканчивают проверкой каждой записи в таблице твитов вместо использования INDEX.Это сделает параметр UNION предпочтительным, потому что каждая половина запроса получит выгоду от индекса в поле user_id.
Но вы МОЖЕТЕ фактически реорганизовать этот угловой случай из своего кода в целом: сделайте каждого пользователя подписчикомо себе.Это будет означать, что получение твитов для подписчиков будет, естественно, включать самого пользователя.Будет ли это иметь смысл во всех случаях, зависит от вашего дизайна и других функциональных требований.
Короче говоря, вам лучше всего создать некоторые репрезентативные данные и протестировать варианты.Но я бы не стал сейчас волноваться об этом.Пока вы инкапсулируете этот код в одном месте, вы можете просто выбрать тот, который вам наиболее удобен.Затем, когда остальная часть системы будет взломана, и вы будете гораздо увереннее, что ничего не изменится, вы можете вернуться и оптимизировать , если необходимо .