我在mysql中有一个这样的日志表:
id | pair | checkintime | checkouttime | comment 1 | 1 | 2016-05-28 08:10:22 | 0000-00-00 00:00:00 | bla bla1 2 | 1 | 0000-00-00 00:00:00 | 2016-05-28 11:10:22 | bla bla2 3 | 3 | 2016-05-29 06:12:12 | 0000-00-00 00:00:00 | bla bla3 4 | 3 | 0000-00-00 00:00:00 | 2016-05-29 09:02:22 | bla bla4 5 | 5 | 2016-05-23 08:32:24 | 0000-00-00 00:00:00 | bla bla5
checkin和checkout操作都会在db中生成一个唯一ID的行。现在我想进行SELECT查询,并在一行中获得每对结果:
ci_id | ci_time | ci_comment | co_id | co_time | co_comment | 1 | 2016-05-28 08:10:22 | bla bla2 | 2 | 2016-05-28 11:10:22 | bla bla1 | 3 | 2016-05-29 06:12:12 | bla bla3 | 4 | 2016-05-29 09:02:22 | bla bla4 | 5 | 2016-05-23 08:32:24 | bla bla5 | | | |
请注意,结帐行可能不存在(如id 5没有任何相关的对行)
有人可以帮我解决SQL查询吗?谢谢!
答案 0 :(得分:0)
您需要使用pair
列自行加入日志表并使用日期时间字段来确定哪个是签入的,哪个是签出的。:
select l1.id as ci_id, l1.comment as ci_comment, ..., l2.id as co_id, l2.comment as co_comment, ...
from log l1
left join log l2 on l1.pair=l2.pair and l2.checkintime='0000-00-00 00:00:00'
where l1.checkouttime='0000-00-00 00:00:00'
答案 1 :(得分:0)
假设logout事件(以及日志表中的一行)只能在登录事件之后创建,因此注销行的id必须大于登录行可以使用以下查询:
SELECT
l1.id AS ci_id,
l1.checkintime AS ci_time,
l1.comment AS ci_comment,
l2.id AS co_id,
l2.checkouttime AS co_time,
l2.comment AS co_comment
FROM
log_table l1 LEFT JOIN log_table l2 ON (l1.pair = l2.pair AND l1.id < l2.id)
如果没有签出行,则co_ *列将显示为NULL值,如果需要显示空单元格,则应根据需要将IFNULL(l2.id AS co_id, "")
等添加到select子句中。