2015-05-31 2 views
-1

Давайте представим, что мы имеем задачи таблица содержитКак сделать этот запрос?

user_id date 
1   2015-01-01  
1   2015-01-01  
1   2015-01-02   
2   2015-01-03  

Как отобразить данные, как показано ниже

user_id  count  date 
    1   2   2015-01-01 
    1   1   2015-01-02 
    1   0   2015-01-03 

    2   0   2015-01-01 
    2   0   2015-01-02 
    2   1   2015-01-03  
+1

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

+0

Вы не ответили –

+0

У вас нет ПЕРВИЧНОГО КЛЮЧА, который со временем может оказаться проблематичным – Strawberry

ответ

2

Если нули являются важно, то вы могли бы сделать что-то вроде этого:

select 
    user_id_date_crossjoin.user_id, 
    user_id_date_crossjoin.`date`, 
    coalesce(`count`, 0) as `count` 
from 
    (select 
     user_id, 
     `date` 
    from 
     (select distinct user_id from tasks) all_userids, 
     (select distinct `date` from tasks) all_userid_dates 
    ) user_id_date_crossjoin 
left outer join 
    (select 
     user_id, 
     count(*) as `count`, 
     `date` 
    from tasks 
    group by user_id, `date`) user_id_date_counts 
on user_id_date_crossjoin.user_id = user_id_date_counts.user_id 
and user_id_date_crossjoin.`date` = user_id_date_counts.`date` 

См. http://sqlfiddle.com/#!9/e17090/3

+1

Рад это услышать. :) Если вы не получите более устрашающее решение, не могли бы вы принять его в качестве ответа? –

+1

Я собираюсь сделать это на прикладном уровне, что запрос может быть медленным с большими данными –

+0

Это имеет смысл, @OmarMakled. Хотелось бы, чтобы я ответил «сделай это на прикладном уровне». Это бы прибило его. Такова жизнь. –

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