在mysql或php中显示每个人数据的列表日期

vwkv1x7d  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(380)

我有一个名为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中实现这一点?提前谢谢。

41zrol4v

41zrol4v1#

你可以试试这个。
使用 CROSS JOINabsen_calendar 表格为姓名和日历制作一个完整的表格,然后 absenOUTER JOIN 基于结果集。
然后使用 CASE WHENMAX 做枢轴运动。

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公司

aor9mmx1

aor9mmx12#

您需要与列出所有人名的表联接。如果你没有这样一个真正的表,你可以从 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'

相关问题