假设我有以下两个表:
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
并在我的查询中的其他地方再次使用它。
示例数据,使用一些更抽象的对象表示法:
假设以下是特定玩家的结果数据:
- 玩家加入_1
- Playerleave_1
- 玩家加入_2
- Playerleave_2
然后我想创建以下行作为(子)查询的输出:
- (玩家加入_1,玩家离开_1)
- (玩家加入_2,玩家离开_2)
最佳答案
这会让你们更亲近吗?
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 表的任意行。 鉴于当前的数据库结构,您将需要编写一个存储过程,这显然比单个查询工作更多。
我建议您更改数据库结构(如果可能)。
我的建议是去掉 playerleaves
表并在 playerjoins
表中添加 leaveDate 列。
希望这对您有所帮助!
关于mysql - 选择表中每对 2 行的日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20223310/