代码之家  ›  专栏  ›  技术社区  ›  Andhika R.K.

在MySQL或PHP中显示每个人数据的列表日期

  •  1
  • Andhika R.K.  · 技术社区  · 7 年前

    我有一个名为absen\u calendar和absen的表,absen\u calendar只包含从2018-11-01到2018-11-30的日期列表。

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

    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 回复  |  直到 7 年前
        1
  •  0
  •   D-Shih    7 年前

    你可以试试这个。

    使用 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
    

    sqlfiddle

        2
  •  0
  •   Barmar    7 年前

    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'
    
    推荐文章