MySQL Показать все Дата между диапазонами, хотя нет записи - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть таблица xDateList, содержащая:

+---------+
 xDateList 
+---------+
2018-11-01
2018-11-02
2018-11-03
2018-11-04
2018-11-05

А также таблица ScanLog

--------------------------------------
ID  Name   ScanDate               Code
--------------------------------------
1   John   2018-11-02 07:00:00    IN
1   John   2018-11-02 10:00:00    OUT
1   John   2018-11-04 08:00:00    IN
1   John   2018-11-04 12:00:00    OUT

Я пробовал это, но он не может отобразить все записи в xDateList, он показывает только записи в таблицеScanLog

select xDateList.date, 
       scanlog.name, 
       MIN(scanlog.scandate) AS `IN`, 
       MAX(scanlog.scandate) AS `OUT`
from scanlog 
left JOIN xDateList ON xDateList.date = date(scanlog.scandate) 
where scanlog.id='1' 
GROUP BY DATE(scanlog.scandate)

Я хочу получить такой результат

--------------------------------------------
Date         ID   Name   In         Out
--------------------------------------------
2018-11-01   1    John   
2018-11-02   1    John   07:00:00   10:00:00
2018-11-03   1    John
2018-11-04   1    John   08:00:00   12:00:00
2018-11-05   1    John

Спасибо за помощь

1 Ответ

0 голосов
/ 28 ноября 2018

Вам необходимо изменить порядок таблиц в LEFT JOIN.Всегда помните это, чтобы рассмотреть все строки из определенной таблицы;эта конкретная таблица должна быть самой левой таблицей в Join.

Кроме того, при выполнении LEFT JOIN в правой части таблицы ON должны быть указаны условия для правой таблицы;в противном случае условия в предложении WHERE могут фактически превратить его в INNER JOIN.

Кроме того, в этом случае GROUP BY должно быть на xDateList.date, чтобы показать все строки, соответствующие значениям xDateList.date.И нам нужно убедиться, что все неагрегированные столбцы в списке SELECT также указаны в предложении GROUP BY.Проверьте: Ошибка, связанная с only_full_group_by при выполнении запроса в MySql

SELECT xDateList.date, 
       scanlog.name, 
       MIN(scanlog.scandate) AS `IN`,
       MAX(scanlog.scandate) AS `OUT`
FROM xDateList  
LEFT JOIN scanlog  
  ON xDateList.date = date(scanlog.scandate) AND
     scanlog.id='1' 
GROUP BY xDateList.date, scanlog.name 

Результат

| date       | name | IN                  | OUT                 |
| ---------- | ---- | ------------------- | ------------------- |
| 2018-11-01 |      |                     |                     |
| 2018-11-02 | John | 2018-11-02 07:00:00 | 2018-11-02 10:00:00 |
| 2018-11-03 |      |                     |                     |
| 2018-11-04 | John | 2018-11-04 08:00:00 | 2018-11-04 12:00:00 |
| 2018-11-05 |      |                     |                     |

Посмотреть на БД Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...