首页 > 解决方案 > 在 MySQL 或 PHP 中显示每个人数据的列表日期

问题描述

我有名为 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 显示列表日期。有时 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 中执行此操作?提前致谢。

标签: phpmysqlsqldate

解决方案


你可以试试这个。

CROSS JOINabsen_calendartable 一起使用为名称和日历制作一个完整的表格,然后根据结果集制作absen表格。OUTER JOIN

然后CASE WHENMAXdo 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


推荐阅读