2016-06-20 2 views
0

У меня есть следующая схема: http://sqlfiddle.com/#!9/bd3a4/1 Я хотел бы группу по дате() и добавить где user_id = .. в день и рассчитывать на результатах в день?. требуется День результат | TotalRequests | TotalOrdersкак MySQL группы по дате кратному остался присоединиться к

+1

Спасибо за скрипку. Но также добавьте всю необходимую информацию в вопрос. Разрыв ссылок, особенно SQLFiddle. И мы хотим, чтобы сообщения были полезны будущим посетителям. –

ответ

1

Так как вы могли бы иметь заказ на 1-й день, и запрос на 8-й день, вы можете иметь записи на одной стороне но не другой. Чтобы квалифицировать ваши потребности, я бы сделал UNION всех заказов и запросов по дате. Затем сверните эти значения. Внутренний запрос на предварительный агрегат - это предложение WHERE для каждого пользователя. В предагрегатном запросе также есть столбец recSource, чтобы указать, откуда запись была получена из «O» из заказов и «R» из запросов, поэтому свертка знает, какой столбец будет хранить общий счет соответственно.

select 
     preAgg.recDate, 
     SUM(case when preAgg.recSource = 'O' then preAgg.recCount else 0 end) as OrderCount, 
     SUM(case when preAgg.recSource = 'R' then preAgg.recCount else 0 end) as RequestCount 
    from 
     (select 
       date(o.created_at) recDate, 
       'O' as recSource, 
       count(*) as recCount 
      from 
       orders o 
      where 
       o.user_id = 3 
      group by 
       date(o.created_at) 
     UNION ALL 
     select 
       date(r.created_at) recDate, 
       'R' as recSource, 
       count(*) as recCount 
      from 
       requests r 
      where 
       r.user_id = 3 
      group by 
       date(r.created_at)) preAgg 
    group by 
     preAgg.recDate 
    order by 
     preAgg.recDate 

Для оптимизации запросов, я бы обеспечить ваш заказ и запрос таблицы и имеют имеют индекс (user_id, created_at).

SQL Fiddle result

+0

Это замечательно, не знаю эту технику, как бы добавить, скажем, commissions_table и SUM (commissions.amount) за день(), в этом случае мы не сможем использовать UNION. – dflow

+0

@dflow, тот же процесс, просто добавьте ДОПОЛНИТЕЛЬНЫЙ ... «UNION ALL», но с тем же столбцом/суммой/группой. Установите recSource как «C» для Комиссии (как пример). и измените с COUNT (*) на SUM (комиссионный счет) как recCount, чтобы он соответствовал значениям ожидания внешнего запроса. И затем добавьте окончательный SUM (case/when) для комиссии recSource value = «C» – DRapp

+0

отличный, еще одна вещь. Комиссия имеет десятичный тип, поэтому все результаты возвращаются в десятичном формате, поэтому он составляет 84,00 и т. Д. как я могу установить формат столбца результата? – dflow

0

Вы можете использовать следующий запрос:

SELECT 
DATE(o.created_at) AS Day 
,COUNT(r.id) AS TotalRequests 
,COUNT(o.id) AS TotalOrders 
FROM orders o 
LEFT JOIN 
requests r ON 
r.id = o.request_id 
WHERE o.user_id = 3 
GROUP BY DATE(r.created_at), DATE(o.created_at),o.user_id 
+0

спасибо за ответ, как бы я объединил результат с Day | TotalRequests | TotalOrders – dflow

+0

@dflow проверить мое редактирование .. –

+0

это не возвращает правильные данные. – dflow