MySQL SubQuery / Correlated Query

Я создаю страницу статистики пользователя и пытаюсь правильно отобразить статистику и хотел бы получить некоторую помощь.

У меня есть веб-сайт, который предлагает загружаемые файлы для зарегистрированных пользователей, и я хотел бы отслеживать загрузки и сколько раз каждый пользователь загружал этот файл, а также сколько уникальных продуктов они загрузили.

Таблица: customer_statistics

| user |  product_id  |  file_download  |  date_accessed   |
------------------------------------------------------------
| tom  |  1104        |  mp3       |  2017-05-06 00:00:00  |
| tom  |  1048        |  video     |  2017-05-06 00:00:00  |
| tom  |  1048        |  video     |  2017-05-06 00:00:00  |
| tom  |  1048        |  video     |  2017-05-07 00:00:00  |
| tom  |  1048        |  video     |  2017-05-08 00:00:00  |
| tom  |  1010        |  video     |  2017-05-08 00:00:00  |
| tom  |  1077        |  video     |  2017-05-08 00:00:00  |
| sue  |  1749        |  photo     |  2017-05-09 00:00:00  |
| sue  |  1284        |  video     |  2017-05-09 00:00:00  |
| sue  |  1284        |  video     |  2017-05-09 00:00:00  |
| sue  |  1065        |  mp3       |  2017-05-09 00:00:00  |
| sue  |  1344        |  video     |  2017-05-10 00:00:00  |
| sue  |  2504        |  photo     |  2017-05-10 00:00:00  |

Я бы отобразил данные так:

Name | Unique Mp3s | Unique Photos | Unique Videos | Total
----------------------------------------------------------
Tom  |    1        |    0          |    3          |  7
Sue  |    1        |    2          |    2          |  6

Колонны unique mp3s/photos/videos покажи сколько уникальных product_id каждый тип файла был загружен с total показывает общее количество всех типов файлов и вхождений, добавленных для этого конкретного пользователя.

Каков наилучший способ достижения вышеуказанного результата?

Большое спасибо заранее!

2

Решение

Я бы сделал это таким образом, подзапрос не требуется:

SELECT user AS `Name`,
COUNT(DISTINCT CASE file_download WHEN 'mp3' THEN product_id END) AS `Unique Mp3s`
COUNT(DISTINCT CASE file_download WHEN 'photo' THEN product_id END) AS `Unique Photos`
COUNT(DISTINCT CASE file_download WHEN 'video' THEN product_id END) AS `Unique Videos`
COUNT(DISTINCT product_id) AS `Total`
FROM customer_statistics
GROUP BY user;
2

Другие решения

Других решений пока нет …