2011-02-06 53 views
0

我有一個MySQL表有以下設置:如何從MySQL表中獲取最新的可用數據集(每天存儲數據集)?

CREATE TABLE IF NOT EXISTS `coords` (
    `project_id` int(4) NOT NULL, 
    `day` tinyint(4) NOT NULL, 
    `x` tinyint(4) NOT NULL, 
    `y` tinyint(4) NOT NULL, 
    `z` tinyint(4) NOT NULL, 
    PRIMARY KEY (`tid`,`day`,`x`,`y`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

每個項目運行數天。每天都會對一些案例進行測試,並將結果(座標集)保存在此表中(以及項目ID和日期編號)。同一組x和y座標可以比一次保存更多(z座標是實際結果)。

現在我想要獲取具有最新數據的單個項目的所有可用座標集。

也就是說,假設我有以下數據:

pid | day | x | y | z 
    1 | 1 | 2 | 1 | 5 
    1 | 1 | 2 | 2 | 6 
    1 | 2 | 3 | 3 | 7 
    1 | 3 | 2 | 1 | 8 
    1 | 3 | 3 | 3 | 9 

查詢現在返回:

day | x | y | z 
    1 | 2 | 2 | 6 
    3 | 2 | 1 | 8 
    3 | 3 | 3 | 9 

我嘗試以下查詢:

SELECT day, x, y, z 
FROM coords 
WHERE pid = 1 
GROUP BY CONCAT(tid,'.',x,'.',y) 
ORDER BY day DESC 

但這個查詢返回老數據,就像day = 1,x | y | z = 2 | 1 | 5,而不是day = 3,x | y | z = 2 | 1 | 8。

有人能請我指出我在這裏失蹤的正確方向嗎?

由於提前, 保羅

回答

1

添加id字段嘗試了這一點:)可能會做的魔力。

SELECT 
    day, 
    x, 
    y, 
    z 
FROM 
    coords 
    JOIN 
    (SELECT MAX(tid) AS max_tid FROM coords GROUP BY CONCAT_WS('.', day, x, y)) sub ON (sub.max_tid = coords.tid) 
WHERE 
    pid = 1 
1

以及我的事情你有問題存在,因爲一旦你做Select * from coords order by day asc limit 1你會得到隨機。 2.1.5或2.2.6。取決於數據庫的感受。根據數據庫知道哪些行插入的順序,你明確需要更具體的「日期」或ID或其他內容。例如,在此添加一個ID字段。

Select distinct day, x,y,z 
FROM coords 
where pid = 1 
order by id desc 

此,如果你在那裏

+0

但是,這一天是某種id(雖然不是唯一的),不是嗎?同一套x,y座標只能每天提交一次。所以通過按日排序和一天的額外分組排序,我認爲這應該做到這一點。 – Paul 2011-02-06 21:16:06

+0

但是數據庫仍然有問題知道哪一行最後被插入。在這種情況下,順序沒有意義。如果你不想做太複雜的查詢,你應該考慮添加該id字段。 – exus 2011-02-06 21:25:14

相關問題