MySQL - добавление объединений изменений значений счетчика / суммы?

0

Я не могу не думать, что это общий вопрос, но для жизни я не могу найти решение.

Скажем, у меня есть этот запрос:

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, и я попытался добавить к нему столбцы, но я не могу это взломать.

  • 0
    Несомненно, новое объединение создает больше записей (отношение один ко многим). Чтобы решить эту проблему, вы можете использовать подзапрос для подсчета connected_vid_evt per from_uid, прежде чем вернуться к внешнему запросу.
  • 0
    Интересно ... если вы можете уточнить это в ответе, я попробую. Благодарю.
Теги:
count
aggregate-functions

1 ответ

1
Лучший ответ

Попробуйте следующее. Он использует подзапрос, вычисляющий 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
  • 0
    Спасибо - сработало угощение. Почему мне не нужно делать это при первом включении на часах? Это только последующие объединения после первого?
  • 0
    @ Utkanos, так как один ряд watches имеет только одного пользователя, это нормально. но когда вы присоединяетесь к messages , то в одной строке watches может быть много соответствующих messages (через users ) и наоборот. Следовательно, агрегация watches или messages должна находиться в подзапросе (или, возможно, в обоих).
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню