#mysql
#mysql
Вопрос:
У меня есть две таблицы. Первое — это подписчики. Подписчики также назначаются в определенную категорию. Вторая таблица — платежи, произведенные подписчиками. Я хочу знать, каково среднее время между моментом подписки и ПЕРВЫМ платежом подписчика (можно сделать несколько).
Вот фрагмент SQL, но он пока не делает то, что я хочу, хотя у меня такое чувство, что я близок 😉
SELECT category,
AVG(TIMESTAMPDIFF(HOUR, subs.timestamp, MIN(payments.timestamp)))
FROM subs
JOIN payments ON (payments.user_id = subs.user_id)
GROUP BY category
Теперь я получаю «Недопустимое использование групповой функции» — из-за функции MIN, так что это неправильно. Что мне теперь делать? Заранее спасибо!
Ответ №1:
SELECT category,
AVG(TIMESTAMPDIFF(HOUR, subs.timestamp, p.timestamp))
FROM subs
JOIN ( SELECT user_id
, min(timestamp) timestamp
FROM payments
GROUP BY user_id
) p
ON p.user_id = subs.user_id
GROUP BY category
Если вам нужно обновить другую таблицу с результатами этого запроса, вы могли бы сделать что-то вроде этого (не тестировалось, поэтому могут быть синтаксические ошибки, но, надеюсь, вы поняли идею). Я предполагаю, что another_table
у него есть столбцы category и avg_hrs_spent.
UPDATE another_table
SET avg_hrs_spent =
(
SELECT a.avg_hrs_spent FROM
(
(SELECT category,
AVG(TIMESTAMPDIFF(HOUR, subs.timestamp, p.timestamp)) avg_hrs_spent
FROM subs
JOIN ( SELECT user_id
, min(timestamp) timestamp
FROM payments
GROUP BY user_id
) p
ON p.user_id = subs.user_id
GROUP BY category) a
)
WHERE a.category = another_table.category
)
Комментарии:
1. Я думаю, что это правильно, нужно сделать много дополнительных запросов, чтобы узнать, правильно ли указано число 🙂 Один вопрос: что именно делает отметка времени MIN (timestamp)?
2. В приведенном выше запросе он получает минимальную временную метку для каждого идентификатора пользователя. Затем мы присоединяем к этому результату subs.user_id, чтобы мы могли получить среднее значение для каждой категории по всем user_id.
3. Круто! Теперь я хочу обновить другую таблицу (которая содержит некоторую другую информацию о каждой категории пользователей) с результатами этого запроса. Как мне это сделать? (Или мне нужно опубликовать новый вопрос для этого …)