mariadb MySQL -将2行合并为1行时,带有IF NULL的子查询未跟在where子句后面

t8e9dugd  于 2022-11-08  发布在  Mysql
关注(0)|答案(1)|浏览(107)

我正在尝试使用子查询IF NULL将包含行INOUT的出勤对合并到一行中
我有一个用户710的应用程序表,它用于用户的进入时间和退出时间

id  userid  mode  date_entry    time_entry
1   710     In    2022-03-23    2022-03-23 07:05:58
2   710     Out   2022-03-24    2022-03-24 07:03:25
3   710     In    2022-03-24    2022-03-24 07:00:05
4   710     Out   2022-03-24    2022-03-24 18:06:23
5   710     In    2022-03-25    2022-03-25 07:10:16
6   710     In    2022-03-26    2022-03-26 07:11:57
7   710     Out   2022-03-26    2022-03-26 18:18:12

并使用此查询:

SELECT a.`id`,a.`userid`,a.`date_entry`,
(SELECT MIN(b.`time_entry`) FROM erpweb.`app` b WHERE b.`date_entry` = a.`date_entry` AND b.`mode` = 'IN' AND b.`userid` = a.`userid`) AS 'IN',
IFNULL(
    (SELECT b.`time_entry` FROM erpweb.`app` b WHERE b.`date_entry` = a.`date_entry` AND b.`mode` = 'OUT' AND b.`userid` = a.`userid` LIMIT 1),
    (SELECT MIN(b.`time_entry`) FROM erpweb.`app` b WHERE b.`date_entry` = DATE_ADD(a.`date_entry`,INTERVAL 1 DAY) AND b.`mode` = 'OUT' AND b.`userid` = a.`userid`)
    )AS 'OUT'
FROM erpweb.`app` a
WHERE a.`date_entry` BETWEEN '2022-03-23' 
  AND '2022-03-26'
GROUP BY a.`date_entry`,a.`userid`

我得到了这个结果。您可以在行ID 5中看到,它采用了2022-03-26OUT,这与我的SQL查询第4行中的where子句“WHERE b. date_entry = a. date_entry”不匹配,因为我没有2022-03-25的OUT

id  userid  date_entry  IN                    OUT
1   710     2022-03-23  2022-03-23 07:05:58   2022-03-24 07:03:25
2   710     2022-03-24  2022-03-24 07:00:05   2022-03-24 07:03:25
5   710     2022-03-25  2022-03-25 07:10:16   2022-03-26 18:18:12
6   710     2022-03-26  2022-03-26 07:11:57   2022-03-26 18:18:12

预期结果必须为:NULL在行ID 5中,因为用户ID 710没有时间OUT用于日期2022-03-25

id  userid  date_entry  IN                    OUT
1   710     2022-03-23  2022-03-23 07:05:58   2022-03-24 07:03:25
2   710     2022-03-24  2022-03-24 07:00:05   2022-03-24 07:03:25
5   710     2022-03-25  2022-03-25 07:10:16   NULL
6   710     2022-03-26  2022-03-26 07:11:57   2022-03-26 18:18:12
w1e3prcc

w1e3prcc1#

SELECT *
FROM table t1
LEFT JOIN table t2 
    ON t1.time_entry < t2.time_entry 
   AND t2.mode = 'Out'
   AND NOT EXISTS ( SELECT NULL
                    FROM table t3
                    WHERE t1.time_entry < t3.time_entry
                      AND t3.time_entry < t2.time_entry )
WHERE t1.mode = 'In'

即选择行对,其中前一行是IN,后一行是OUT,并且在它们之间没有任何行。如果确定的IN行没有这样的OUT行,则添加NULL行。
如果需要,按userid添加条件。

相关问题