Вы сделали 3 ошибки, из которых 2 относятся к делу:
- Вы поменяли местами порядок таблиц в объединении (легко исправить)
- Ваш запрос не соответствуетотражает ваше заявленное намерение (труднее исправить)
- Вы используете
GROUP BY
, когда это не нужно (не имеет значения в данном конкретном случае)
Я сосредоточусь на 2. Вы 'близки к вашей цели, но не все там.Исправляя первую и третью ошибки, вот ваш запрос:
SELECT cal.date, comp.name, comp.hours
FROM calendar AS cal
LEFT JOIN company AS comp ON cal.date=comp.date
Это будет делать что-то вроде следующего:
For each cal_row in calendar:
For each comp_row in company:
If cal_row.date equals comp_row.date:
Create output row and append to output
If no rows created:
Create output row, fill with NULLs, and append to output
Таким образом, ваш запрос гарантирует как минимум 1 выходную строку наДата.То, что вы ищете, это 1 строка вывода на дату, на компанию .Один из способов сделать это - создать промежуточную таблицу и присоединиться к ней слева:
SELECT tbl.date, tbl.name, comp.hours
FROM (
SELECT DISTINCT cal.date, comp.name
FROM calendar AS cal
CROSS JOIN company as comp
) AS tbl
LEFT JOIN LEFT JOIN company AS comp ON
tbl.date = comp.date AND tbl.name= comp.name
http://sqlfiddle.com/#!9/517b4e/11/0
Это соответствует желаемому результату.