2015-06-04 2 views
1

У меня есть сложная проблема с MySQL, которая выше моих базовых знаний, я был бы очень признателен за любую помощь.Группа MySQL по столбцу, затем подсчитывается другим столбцом

настоящее время у меня следующий запрос:

select users.userid, CAST(posts.time AS DATE) 
FROM users INNER JOIN posts ON users.post_id = posts.id 

Пример вывода:

userid | CAST(posts.time AS DATE)  
1............2015-01-05  
2............2015-02-06  
2............2015-04-07 
2............2015-04-07  
3............2015-04-07 
1............2015-02-06  
7............2015-01-05 

может повторить идентификатор себя, не может быть 10 различных строк с идентификатором пользователя = 1; то же самое относится к столбцу даты. Я хотел бы подсчитать, сколько строк было у каждого пользователя для каждой отдельной даты. Исходя из вышеприведенных данных, выход должен быть:

-----------------------1----------2--------3---------4--------5--------6-------7 
2015-01-05.............1..........0........0.........0........0........0.......1 
2015-02-06.............1..........1........0.........0........0........0.......0 
2015-04-07.............0..........2........1.........0........0........0.......0 

У меня 7 пользователей в общей сложности. Я хотел бы дополнительно заменить идентификатор пользователя на имя, которое я определяю; например Я бы определил 1 в заголовке/заголовке, который будет отображаться как Майк, 2, который будет отображаться как Джордж, и т. Д. ...

Возможно ли это? Всем спасибо.

+0

У вас ТОЛЬКО 7 пользователей? Дело в том, что такие запросы просты, если значения столбцов известны и не изменяются. И боль в задней части, если они это сделают. –

ответ

1

Если у вас есть 7 только для пользователей, и только когда-либо будет, поворачиваясь данные не так уж сложно:

select date(posts.time), 
     count(case when userid = 1 then userid end) as `1`, 
     count(case when userid = 2 then userid end) as `2`, 
     count(case when userid = 3 then userid end) as `3`, 
     count(case when userid = 4 then userid end) as `4`, 
     count(case when userid = 5 then userid end) as `5`, 
     count(case when userid = 6 then userid end) as `6`, 
     count(case when userid = 7 then userid end) as `7` 
users INNER JOIN posts ON users.post_id = posts.id 
group by date(posts.time) 

demo here

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

+0

Блестящий! В первый раз я задаю вопрос здесь, и я действительно впечатлен ... большое вам спасибо! И спасибо, Джонатан. – Doron

0

Вот что у меня есть (я не закончил его для вас):

SELECT date, SUM(id_1) AS Mike, SUM(id_2) AS George FROM (SELECT CASE id WHEN 1 THEN 1 ELSE 0 END as id_1, CASE id WHEN 2 THEN 1 ELSE 0 END as id_2, date FROM test_dates) as tmp GROUP BY date; 

+------------+------+--------+ 
| date  | Mike | George | 
+------------+------+--------+ 
| 2015-01-05 | 1 |  0 | 
| 2015-02-06 | 1 |  1 | 
| 2015-04-07 | 0 |  2 | 
+------------+------+--------+ 

Хитрость подставляя суммирования 1s, когда то, что вы хотите, это подсчет является обычной отчетности трюк, который стоит помнить , Убей мой разум, когда я впервые увидел его.

+0

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

+0

Включено для потомков, потому что мне скучно, и уже поздно. Это пример проблемы MapReduce, которая образует основу большой революции данных. Проблема с MapReduce может привести к невероятной оптимизации производительности распределенных вычислений в таких системах, как Hadoop. Python также обладает языковыми функциями, которые специализируются на нем. –

+1

С нетерпением ждем этого, @pala_ –

Смежные вопросы