我有一个名为 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 中为 absen 表中的每个 personName 显示列表日期。有时 1 个人在 personDate 中可能只有 1 个 personInfo。
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 中执行此操作?提前致谢。
最佳答案
你可以试试这个。
使用 CROSS JOIN
和 absen_calendar
表为名称和日历创建一个完整的表,然后是 absen
表 OUTER JOIN
基于结果集。
然后使用 CASE WHEN
和 MAX
做数据透视。
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
关于php - 在 MySQL 或 PHP 中显示每个人数据的列表日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52105675/