我有一个名为absen\u calendar和absen的表,absen\u 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表中每个人名的列表日期。有时一个人只能有一个人信息。
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条答案
按热度按时间41zrol4v1#
你可以试试这个。
使用
CROSS JOIN
与absen_calendar
表格为姓名和日历制作一个完整的表格,然后absen
表OUTER JOIN
基于结果集。然后使用
CASE WHEN
与MAX
做枢轴运动。sqlfiddle公司
aor9mmx12#
您需要与列出所有人名的表联接。如果你没有这样一个真正的表,你可以从
absen
(但这意味着,如果某人从未进出过,您就无法找到他们的名字——这是非常糟糕的数据库设计)。