У меня есть база данных, где я храню рыболовные лицензии. Лицензии имеют даты и даты, и я использую таблицу календаря для подсчета количества проданных лицензий за каждый день. Каждая лицензия имеет определенный тип лицензии. Тип лицензии может быть действителен для одной или нескольких рыболовных зон.
Я пытаюсь создать запрос, который показывает некоторые столбцы из таблицы зон и количество проданных лицензий, сгруппированных по дням и рыбацким зонам и отфильтрованных по типу лицензии. Я сделал это для тех дней, когда лицензии были проданы. Однако дни, когда лицензии еще не были проданы, показывают только нулевые значения.
Я крутил голову вокруг этого уже 8 часов. Я уверен, что есть простое решение, я просто не вижу его. SQL Fiddle здесь .
Я думаю, что схема довольно понятна, поэтому я не буду включать ее здесь. Пожалуйста, смотрите скрипку, если это необходимо.
SET @licensetype = 1,
@fromdate = '2019-01-01',
@todate = '2019-01-10';
SELECT zoneID,
dy,
seasonmax,
daymax,
COUNT(lID) AS sold
FROM
( SELECT z.zoneID,
z.seasonmax,
z.daymax,
l.ID AS lID,
l.From,
l.To,
lt.ValidForZone
FROM zones z
LEFT JOIN licensetypes lt ON z.zoneID IN(lt.ValidForZone)
LEFT JOIN licenses l ON lt.ID = l.TypeID
WHERE FIND_IN_SET( z.zoneID,
( SELECT lt2.ValidForZone
FROM licensetypes lt2
WHERE lt2.ID = @licensetype ) ) ) derived
RIGHT JOIN calendar ON calendar.dy >= DATE_FORMAT(derived.From, '%Y-%m-%d')
AND calendar.dy < DATE_FORMAT(derived.To, '%Y-%m-%d')
WHERE calendar.dy >= @fromdate
AND calendar.dy <= @todate
GROUP BY dy,
zoneID
ORDER BY dy