Сначала замените:
WHERE MONTH(paid_at) = 10 AND YEAR(paid_at) = 2011
с:
WHERE paid_at >= '2011-10-01'
AND paid_at < '2011-10-01' + INTERVAL 1 MONTH
так что, если у вас есть индекс на paid_at
, он будет использоваться, и запросу не придется сканировать всю таблицу и вызывать функции YEAR()
и MONTH()
для каждой строки.
Во-вторых, вам не нужен подзапрос в списке SELECT
. Вы можете использовать что-то вроде этого:
SELECT
DATE(paid_at) AS day,
SUM( CASE WHEN shipping_method = 'mondial_relais'
THEN shipping_costs
ELSE 0
END
) AS mr_revenue_real
FROM orders
WHERE paid_at >= '2011-10-01'
AND paid_at < '2011-10-01' + INTERVAL 1 MONTH
GROUP BY DATE(paid_at)
Вы также можете использовать этот запрос, который, вероятно, будет быстрее с индексом (shipping_method, paid_at)
. Это, однако, не покажет ни одного дня без заказа с shipping_method = 'mondial_relais'
:
SELECT
DATE(paid_at) AS day,
SUM(shipping_costs) AS mr_revenue_real
FROM orders
WHERE shipping_method = 'mondial_relais'
AND paid_at >= '2011-10-01'
AND paid_at < '2011-10-01' + INTERVAL 1 MONTH
GROUP BY DATE(paid_at)