Я не могу не думать, что это общий вопрос, но для жизни я не могу найти решение.
Скажем, у меня есть этот запрос:
SELECT
ue.user,
SUM(w.times) AS total_watches,
COUNT(w.vid_id) AS total_unique_watches,
FROM users ue
LEFT JOIN watches w ON w.user_id = ue.user
WHERE ue.user = "fv9jgpd1cmo" && ue.user_type IN ("ds", "s")
GROUP BY ue.user
Это прекрасно работает. Он вытаскивает пользователей, а также количество раз, когда они смотрели видео, а также количество уникальных видеороликов, которые они просматривали. Значения верны - я проверил.
Если я затем продлю запрос другим соединением,
SELECT
ue.user,
SUM(w.times) AS total_watches,
COUNT(w.vid_id) AS total_unique_watches,
COUNT(DISTINCT m.linked_vid_evt) AS answered_vid_events
FROM users ue
LEFT JOIN watches w ON w.user_id = ue.user
LEFT JOIN messages m ON m.from_uid = ue.user /* <-- new join */
WHERE ue.user = "fv9jgpd1cmo" && ue.user_type IN ("ds", "s")
GROUP BY ue.user
... предыдущая статистика COUNT
/SUM
теперь отключена (в этом примере total_watches
должен быть 40, а затем переходить на 880.)
Что я делаю неправильно?
Я почти уверен, что это что-то связано с GROUP BY
, и я попытался добавить к нему столбцы, но я не могу это взломать.
Попробуйте следующее. Он использует подзапрос, вычисляющий count
сначала. distinct
может быть ненужным в этом растворе, а также.
SELECT
ue.user,
SUM(w.times) AS total_watches,
COUNT(w.vid_id) AS total_unique_watches,
m.answered_vid_events
FROM users ue
LEFT JOIN watches w ON w.user_id = ue.user
LEFT JOIN (
SELECT from_uid, COUNT(DISTINCT linked_vid_evt) answered_vid_events
FROM messages
GROUP BY from_uid
) m ON m.from_uid = ue.user
WHERE ue.user = "fv9jgpd1cmo" && ue.user_type IN ("ds", "s")
GROUP BY ue.user
watches
имеет только одного пользователя, это нормально. но когда вы присоединяетесь к messages
, то в одной строке watches
может быть много соответствующих messages
(через users
) и наоборот. Следовательно, агрегация watches
или messages
должна находиться в подзапросе (или, возможно, в обоих).