在MySQL中选择对作为单行

时间:2016-05-31 08:41:47

标签: mysql sql

我在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查询吗?谢谢!

2 个答案:

答案 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子句中。