2009-08-25 104 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