2009-08-25 66 views
1

我想是這樣的:SQL SELECT從副本DISTINCT ORDER BY ID CID

SELECT DISTINCT ID from copies WHERE timestamp < 1229444506 ORDER BY CID 

的問題是,這一個只返回ID,我需要CID和其他表中的列。

這可能是因爲這是完全錯誤的,藏漢其他原因,所以我會解釋我需要什麼。

我有一個表,「記錄」在我maintable每一行變化。這在未來我將能夠及時回溯,看看主桌是如何看起來像某個特定日期的。

因此,我需要的是一個查詢,命令所有行由CID,其中時間戳< 1229444506,然後通過ID DISCTINCT他們。

我想查詢的ID,當CID最新首先責令退還的第一行。

香港專業教育學院試圖得到這個工作,用不同的方法,但沒有運氣。 有什麼建議嗎?

回答

2

我不知道如果我沒有得到它,但對於創建子查詢,將只選擇列?你寫了: 「我希望查詢按ID返回第一行,當按CID最新的順序排列時。」

所以,讓我們的子查詢:

SELECT id, max(cid) as maxcid FROM copies WHERE timestamp < XX group by id 

這會給你的關係ID < =>在你想要CID。現在加入:

SELECT copies.* FROM copies, (SELECT id, max(cid) as maxcid FROM copies WHERE timestamp < xxx group by id) x 
WHERE copies.id=x.id AND copies.cid=x.maxcid; 
+0

這似乎工作,如果我想絕對的萊特斯行,但如果我想要時間戳<1229444506我應該在哪裏放時間戳<1229444506? – 2009-08-25 07:48:21

+0

在子查詢中。 – ondra 2009-08-25 08:16:47

+0

乍看之下,這似乎是訣竅,生病將運行一些檢查,看看它是否可以。 謝謝Ondrej Palkovsky。 – 2009-08-25 09:34:47

0
SELECT * FROM copies WHERE timestamp < 1229444506 GROUP BY ID ORDER BY CID DESC; 

編輯

SELECT * FROM copies WHERE timestamp < 1229444506 GROUP BY ID ORDER BY CID; 

你還可以嘗試:

SELECT * FROM copies WHERE timestamp < 1229444506 GROUP BY ID ASC ORDER BY CID; 

或者:

SELECT * FROM copies WHERE timestamp < 1229444506 GROUP BY ID DESC ORDER BY CID; 

是否行得通?

+0

嗨eyze,這是行不通的。我試過這個,它沒有正確地對CID進行排序。爲什麼它這樣做,我不知道。 – 2009-08-25 07:13:42

+0

對不起,我的錯。我會編輯我的答案。 – 2009-08-25 07:24:17

+0

不,我已經用這個查詢嘗試了不同的排序方法,沒有運氣。多數民衆贊成在奇怪的,但我不知道MySQL的內部工作,所以這當然是一個很好的解釋,爲什麼它的行爲是這樣的。 – 2009-08-25 07:39:08

0

數據庫如何知道哪些行要附加到不同的列?說你有

id | name 
---+----- 
    1 | a 
    1 | b 

現在假設查詢:SELECT DISTINCT id, name FROM table。你期望在你的結果中顯示哪個名字? a或b?

如果這不是一個問題,您可以通過ID的mysql組的結果,但它是不確定這名字,你會得到

SELECT `id`, `name` FROM `copies` WHERE `timestamp` > 123456789 GROUP BY `id` ORDER BY `cid` DESC 
+0

嗨knitti,那是什麼CID是。它的表中的UNIQUE值,我想要的時間戳CID WHERE timestamp <1229444506. 因此,您的問題A或B的答案,這取決於哪些具有最高的CID,如果兩者都是時間戳<1229444506. – 2009-08-25 07:33:07

+0

然後去Ondrej Palkovsky的解決方案,它正是你想要的 – knittl 2009-08-25 08:27:11