As a follow up to this usefull answer which did manage to solve my problem, I post back because, to be honest, I don't fully understand this (for me complex) SELECT.
If someone could light me up about the data calculation (why to split it into a b c
) and the CROSS JOIN part I would be gratefull.
This answer did a enourmous performance upgrade in my code, so I do think it is usefull to have this method explained here, for everyone.
Cheers
SELECT dates.Date,
coalesce(s.daily_price, 0) AS price, s.id_item AS house
FROM
(SELECT a.Date
FROM
( SELECT '$to' - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY AS Date, '0' AS price
FROM
(SELECT 0 AS a
UNION ALL SELECT 1
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
UNION ALL SELECT 5
UNION ALL SELECT 6
UNION ALL SELECT 7
UNION ALL SELECT 8
UNION ALL SELECT 9) AS a
CROSS JOIN
(SELECT 0 AS a
UNION ALL SELECT 1
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
UNION ALL SELECT 5
UNION ALL SELECT 6
UNION ALL SELECT 7
UNION ALL SELECT 8
UNION ALL SELECT 9) AS b
CROSS JOIN
(SELECT 0 AS a
UNION ALL SELECT 1
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
UNION ALL SELECT 5
UNION ALL SELECT 6
UNION ALL SELECT 7
UNION ALL SELECT 8
UNION ALL SELECT 9) AS c) a
WHERE a.Date BETWEEN '$from' AND '$to'
ORDER BY a.Date) dates
LEFT JOIN ".T_ITEM_SEASONS." s ON dates.Date BETWEEN s.season_start AND s.season_end
Edit: In my original question I had added a bug which is discussed under. The buggy code was:
300 * c.a
in
( SELECT '$to' - INTERVAL (a.a + (10 * b.a) + (300 * c.a)) DAY AS Date,