LINUX.ORG.RU

SQL запрос

 


0

1

Есть 2 таблицы - posts и comments. Posts - сообщения, comments - комментарии к сообщениям.
У каждого поста/комментария есть userID автора и timestamp.
Есть метрика - активность пользователя: пользователь написал пост или/и оставил комментарий.
Как легче всего подсчитать количество уникальных активных пользователей по дням?
Чтобы подсчитать кол-во уникальных активных пользователей, которые написали сообщение, можно сделать такой sql-запрос:

SELECT count(distinct(p.userID)) AS total ,DATE_FORMAT(FROM_UNIXTIME(p.timestamp), '%d-%m-%Y') AS date FROM posts_table p GROUP BY DATE_FORMAT(FROM_UNIXTIME(p.timestamp), '%d-%m-%Y');
Из минусов: использование distinct'а - он медленный. Ну да ладно...

Кол-во уникальных активных пользователей, которые написали комментарии, считается аналогично:
SELECT count(distinct(с.userID)) AS total ,DATE_FORMAT(FROM_UNIXTIME(с.timestamp), '%d-%m-%Y') AS date FROM comments_table c GROUP BY DATE_FORMAT(FROM_UNIXTIME(c.timestamp), '%d-%m-%Y');

Вопрос: как подсчитать кол-во уникальных активных пользователей в сумме по комментам и постам?

Загвоздка в том, что если пользователь в этот день отправил сообщение, то он уже считается активным и его НЕ нужно учитывать в комментариях - и наоборот.

Т.е. алгоритм звучит примерно так:
Считаем по дням уникальных пользователей по постам, затем считаем по дня уникальных пользователей по комментариям, но при этом, если в данный день юзер уже написал пост, то его комментарий уже не надо учитывать.

★★★★★

Ответ на: комментарий от kovrik

Сам никогда не тестировал, поэтому смогу ответить только после того, как протестирую у себя на базе. Union предложил лишь как замену другой альтернативе - or, применение которого как раз таки не приветствуется.

winlook38 ★★ ()

А вообще, я бы не стал разделять ОП-посты и комментарии, т.к. они по сути ничем не отличаются. Добавил бы поле Родитель и все посты, у которых он пустой, считал бы ОП-постами, а остальных комментами. Если есть страх получить огромную таблицу, из которой нужно выбрать немногочисленные ОП-посты, покурил бы в сторону портиционирования таблицы по ключу-родителю.

winlook38 ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.