Доброго времени суток уважаемые!
Есть пользователи, публикации пользователей и подписки.
Какой из запросов будет менее нагружено влиять на состояние БД mysql
Необходимо вывести на странице список публикаций моих подписок. Допустим я подписался на 2000 пользователей и хочу посмотреть их ленту. Ситуация с
WHERE IN(id,id,id......) ясна и не очень нравится.
Сделал по аналогии через JOIN и тоже не нравится, в голову ничего пока не приходит...
Структура
CREATE TABLE `friends` (
`from_id` INTEGER(11) UNSIGNED NOT NULL,
`to_id` INTEGER(11) UNSIGNED NOT NULL,
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
) ;
CREATE TABLE `feed` (
`user_id` BIGINT(20) UNSIGNED NOT NULL COMMENT 'пользователь',
`type` TINYINT(3) UNSIGNED NOT NULL COMMENT '1 - публикации, 2 - фотки',
`obj_id` BIGINT(20) DEFAULT NULL COMMENT 'id - объекта',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 'дата события',
)
Пример с JOIN
select distinct
`f.type`, -- тип публикации (фото/текст/.....)
`f.obj_id`, -- id публикации
`fs.from_id`, -- мой ID в подписках (выбираю всех юзеров за кем слежу)
from feed as f -- таблица с ID публикаций
join friends as fs on fs.from_id = f.user_id -- таблица подписок
order by `f.created_at` desc -- сортировка по дате
limit 30
Пример с IN
select distinct
type,
obj_id,
user_id,
created_at
from feed
where user_id in (
select to_id from friends where from_id = :user_id
)
order by created_at desc -- сортировка по дате
limit 30
Выводятся дубли из-за
JOIN , не хитрым путем избавляюсь от них с помощью
distinct.
Возможно, через
GROUP BY будет правильнее, но пока не вижу разницы...