Группировка по дням из двух таблиц?

Есть две таблицы с инфой, все инфу нужно группировать по дням.
Но вот из-за под запросов скорость выполнения составляет 3 секунды, подскажите, как грамотно это реализовать:
select DATE(FROM_UNIXTIME(`e`.`inserted_at`)) as `day`,,
SUM(IF(`e`.`type` = 2, `e`.`total_cost`, 0)) as `f_sum`,
SUM(IF(`e`.`type` = 3, `e`.`total_cost`, 0)) as `d_sum`,
SUM(IF(`e`.`type` = 4, `e`.`total_cost`, 0)) as `w_sum`,
(select count(`id_click`) from `click` where `type`=1 and DATE(FROM_UNIXTIME(`inserted_at`)) = `day`) as `click`,
(select count(`id_click`) from `click` where `type`=2 and DATE(FROM_UNIXTIME(`inserted_at`)) = `day`) as `unique_click`
from `event` as `e`
GROUP BY `day`
ORDER BY `day` DESC
LIMIT 10
  • Вопрос задан
  • 37 просмотров
Решения вопроса 1
erge
@erge
Примус починяю
Вынести подзапросы по click в один подзапрос с группировкой (аналогично как по event)
и сджойнить два подзапроса по дате, как-то так:

SELECT
    e.*, c.`click`, c.`unique_click`
  FROM (
    SELECT
        DATE(FROM_UNIXTIME(`inserted_at`)) as `day`,
        SUM(IF(`type` = 2, `total_cost`, 0)) as `f_sum`,
        SUM(IF(`type` = 3, `total_cost`, 0)) as `d_sum`,
        SUM(IF(`type` = 4, `total_cost`, 0)) as `w_sum`,
      FROM `event`
      GROUP BY `day`
  ) e
  INNER JOIN (
    SELECT
        DATE(FROM_UNIXTIME(`inserted_at`)) as `day`
        SUM(IF(`type` = 1, 1, 0)) as `click`,
        SUM(IF(`type` = 2, 1, 0)) as `unique_click`,
      FROM `click`
      GROUP BY `day`
  ) c ON e.`day` = c.`day`
  ORDER BY e.`day` DESC
  LIMIT 10
;
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы