Показывать дату списка для каждого человека в MySQL или PHP - PullRequest
0 голосов
/ 31 августа 2018

У меня есть таблица с именами absen_calendar и absen, absen_calendar содержит только список дат с 2018-11-01 по 2018-11-30.

absen_calendar
| dateCalendar |
|  2018-11-01  |
|  ...         |
|  2018-11-30  |

и еще одна таблица с именем "absen".

absen
personName | personDate | personTime | personInfo
Joko       | 2018-11-01 | 07:26:00   | IN
Eko        | 2018-11-20 | 07:03:00   | IN
Wahyu      | 2018-11-15 | 17:11:00   | OUT
Joko       | 2018-11-01 | 17:40:00   | OUT

Я пытаюсь показать дату списка в dateCalendar для каждого personName в таблице absen. Иногда у 1 человека может быть только 1 personInfo в personDate.

result
dateCalendar | personName | personTimeIN | personTimeOUT
2018-11-01   | Joko       | 07:26:00     | 17:40:00
2018-11-02   | Joko       | NULL         | NULL
...
2018-11-30   | Joko       | NULL         | NULL
2018-11-01   | Eko        | NULL         | NULL
...
2018-11-30   | Eko        | NULL         | NULL
2018-11-01   | Wahyu      | NULL         | NULL
...
2018-11-15   | Wahyu      | NULL         | 17:11:00
...
2018-11-30   | Wahyu      | NULL         | NULL

Вот мой запрос:

SELECT 
  d.dateCalendar,
  a_in.personName,
  a_in.personTime AS personTimeIN,
  a_out.personTime AS personTimeOUT,
FROM absen_calendar d
LEFT JOIN absen a_in
ON a_in.personDate = d.dateCalendar
AND a_in.personInfo = 'IN'
LEFT JOIN absen a_out
ON a_out.personDate = d.dateCalendar
AND a_out.personInfo = 'OUT'

Как это сделать в MySQL или PHP? Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Вам необходимо присоединиться к таблице, в которой перечислены все имена людей. Если у вас нет такой таблицы по-настоящему, вы можете получить список имен из absen (но это означает, что если кто-то никогда не входил или не выходил, у вас нет возможности найти его имя - это очень плохо проектирование базы данных).

SELECT d.dateCalendar, p.personName, a_in.personTime AS personTimeIN, a_out.personTime AS personTimeOUT
FROM absen_calendar AS d
CROSS JOIN (
    SELECT DISTINCT personName
    FROM absen) AS p
LEFT JOIN absen AS a_in
ON a_in.personDate = d.dateCalendar
AND a_in.personName = p.personName
AND a_in.personInfo = 'IN'
LEFT JOIN absen AS a_out
ON a_out.personDate = d.dateCalendar
AND a_out.personName = p.personName
AND a_out.personInfo = 'OUT'
0 голосов
/ 31 августа 2018

Вы можете попробовать это.

используйте CROSS JOIN с таблицей absen_calendar, создайте полную таблицу для имени и календаря, затем absen таблица OUTER JOIN на основе набора результатов.

, затем используйте CASE WHEN с MAX do pivot.

SELECT ac.dateCalendar,
       name.personName,
       MAX(CASE WHEN personInfo ='IN' THEN personTime end) personTimeIN ,
       MAX(CASE WHEN personInfo ='OUT' THEN personTime end) personTimeOUT
FROM absen_calendar as ac 
cross join (select distinct personName from absen) name
LEFT JOIN absen a on a.personDate =ac.dateCalendar and a.personName = name.personName
GROUP BY 
  ac.dateCalendar,
  name.personName

sqlfiddle

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