说我有以下两个表:
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
并在我的查询中的其他位置再次使用它。
示例数据,使用一些更抽象的对象表示法:
假设以下是特定玩家的结果数据:
然后我想创建以下行作为(子)查询的输出:
答案 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的列。
希望这有帮助。!