mysql- if null的子查询,当将2行组合为1时,请按照where子句。
我试图将包括中的行和 out 在一行中使用 subquery 和(如果null
我有这个用户表 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-26 ,它在我的Where子句中与之匹配“ 其中b。date_entry
= a。date_entry
“在我的SQL查询的第4行中,因为 i在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 2022-03-26 18:18:12
6 710 2022-03-26 2022-03-26 07:11:57 2022-03-26 18:18:12
预期结果必须是: null in Row ID 5 ,因为<<>强>用户ID 710 没有时间 日期 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
i am trying to combine the pair of attendance which includes row IN and OUT in one row using Subquery and IF NULL
I have this app table of user 710, this is use for time in and time out of a user
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
And using this query:
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`
I got this result. you can see in the row ID 5 it takes the OUT of 2022-03-26 which doesn't match in my where clause which is "WHERE b.date_entry
= a.date_entry
" in line 4 of my sql query because i don't have OUT for 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 2022-03-26 18:18:12
6 710 2022-03-26 2022-03-26 07:11:57 2022-03-26 18:18:12
The expected result must be: NULL in row ID 5 because the userid 710 doesn't have time OUT for the date 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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
IE选择行对,其中较早的行在其中,然后排在后面,它们之间没有任何行。如果没有这样的行以确定的行,请添加null Row。
如果需要,请通过
userId
添加条件。I.e. select rows pairs where earlier row is IN and later row is OUT and no any row between them. If no such OUT row for definite IN row then add NULL row.
Add the condition by
userid
if needed.