选择表中每对2行的日期时间

时间:2013-11-26 16:58:49

标签: mysql sql

说我有以下两个表:

CREATE TABLE `playerjoins` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `globalId` int(11) NOT NULL,
  `date` datetime NOT NULL,
  `serverId` int(11) NOT NULL,
  `playerId` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `globalId` (`globalId`),
  KEY `date` (`date`),
  KEY `serverId` (`serverId`),
  KEY `playerId` (`playerId`),
  CONSTRAINT `playerjoins_ibfk_1` FOREIGN KEY (`serverId`) REFERENCES `servers` (`serverId`),
  CONSTRAINT `playerjoins_ibfk_2` FOREIGN KEY (`playerId`) REFERENCES `players` (`playerId`)
) ENGINE=InnoDB AUTO_INCREMENT=64983 DEFAULT CHARSET=latin1

CREATE TABLE `playerleaves` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `globalId` int(11) NOT NULL,
  `date` datetime NOT NULL,
  `serverId` int(11) NOT NULL,
  `playerId` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `globalId` (`globalId`),
  KEY `date` (`date`),
  KEY `serverId` (`serverId`),
  KEY `playerId` (`playerId`),
  CONSTRAINT `playerleaves_ibfk_1` FOREIGN KEY (`serverId`) REFERENCES `servers` (`serverId`),
  CONSTRAINT `playerleaves_ibfk_2` FOREIGN KEY (`playerId`) REFERENCES `players` (`playerId`)
) ENGINE=InnoDB AUTO_INCREMENT=45676 DEFAULT CHARSET=latin1

并且,首先,我想选择按date ASC, globalId ASC排序的每一对行。

我如何能够进行该查询?此外,有关信息,我想使用它来获取(伪代码)row1.datetime, row2.datetime并在我的查询中的其他位置再次使用它。

示例数据,使用一些更抽象的对象表示法:

假设以下是特定玩家的结果数据:

  • Playerjoin_1
  • Playerleave_1
  • Playerjoin_2
  • Playerleave_2

然后我想创建以下行作为(子)查询的输出:

  • (Playerjoin_1,Playerleave_1)
  • (Playerjoin_2,Playerleave_2)

1 个答案:

答案 0 :(得分:1)

这会让你更近一点吗?

SELECT * FROM
playerjoins pj
LEFT JOIN
playerleaves pl
ON( pj.playerId = pl.playerId AND pj.serverId = pl.serverId AND pj.date <= pl.date )
GROUP BY pj.playerId, pj.serverId;

这将为playerleaves表提供任意行。 给定当前的db结构,您将需要编写一个存储过程,这显然比单个查询更多的工作。

我建议您更改数据库结构(如果可能)。

我的建议是你摆脱了playerleaves表,并在playerjoins表中添加了leaveDate的列。

希望这有帮助。!