2013-11-26 67 views
1

每對2排的說,我已經得到了以下兩個表:選擇日期時間在表

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)
+0

你的意思是「我想選擇每一對行」? :O – Manu

+0

@Manu在OP中闡明瞭它。 – skiwi

回答

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表的任意行。 鑑於當前的數據庫結構,您將需要編寫一個存儲過程,這顯然比單個查詢更有效。

我建議你改變數據庫結構(如果可能的話)。

我的建議是,你擺脫playerleaves表和在playerjoins表中添加列的leaveDate。

希望這會有所幫助。

+1

pj.date應該<=比pl.date。 –

+0

這是一個棘手的問題。它確實讓我更接近,問題是'<=''任意'匹配。它不會在下一個日期。 – skiwi

+0

是@skiwi ..它會任意匹配。我會更新答案。用一個查詢來實現你的願望是不可能的。 – Manu