2016-11-09 32 views
3

我有订单数据问题cassandra数据库。 这是我的表结构:通过创建日期在Cassandra

CREATE TABLE posts (
    id uuid, 
    created_at timestamp, 
    comment_enabled boolean, 
    content text, 
    enabled boolean, 
    meta map<text, text>, 
    post_type tinyint, 
    summary text, 
    title text, 
    updated_at timestamp, 
    url text, 
    user_id uuid, 
    PRIMARY KEY (id, created_at) 
) WITH CLUSTERING ORDER BY (created_at DESC) 

,当我运行此查询,我得到了以下信息:

查询

select * from posts order by created_at desc; 

消息

ORDER BY is only supported when the partition key is restricted by an EQ or an IN. 

或者该查询返回的数据不排序:

select * from posts 

回答

2

的错误信息是很清楚的:你不能ORDER BY没有限制用WHERE子句查询。这是设计。

没有WHERE子句运行时,你得到的数据实际上是下令,不与您的聚集键,而是通过应用token function到你的分区键。您可以通过发出确认的顺序:

SELECT token(id), id, created_at, user_id FROM posts; 

其中token函数参数你的分区键完全匹配。

我建议您阅读thisthis以了解您可以/不可以做什么。

+1

你的意思是这个查询应该返回默认排序的数据? –

+1

我试过这个查询,但不幸的是相同的输出(数据没有排序) –

+2

我的意思是我写的是:这个查询*已经返回由令牌(id)函数排序的数据。 – xmas79

3

有几件事情你需要了解, 在你的情况下,分区键是“id”,集群键是“created_at”。

这实际上意味着什么行将存储在基于“id”散列的分区中(取决于您的散列方案,默认情况下它是Murmur3),现在在该分区内,数据根据您的群集进行排序关键,你的情况“created_at”。

所以,如果你在默认情况下从该表中查询一些数据来的结果是根据您的聚簇顺序和默认排序顺序排序是你在创建表指定一个。但是有一个疑难杂症在那里。

如果您没有在WHERE子句中指定分区键,那么结果集的实际顺序将依赖于分区键的散列值(在您的情况下为id)

所以为了通过特定为了得到职位。你必须指定这样的分区键

select * from posts WHERE id = 1 order by created_at desc;

注:

这是没有必要指定ORDER BY子句的查询,如果你想要的排序方向(“升/降”)已经匹配表定义聚簇顺序。

所以基本上以上查询是相同

SELECT * FROM帖子WHERE ID = 1

你可以阅读更多关于此这里http://www.datastax.com/dev/blog/we-shall-have-order

+0

优秀的解释。此外,+1链接我的文章! – Aaron

+0

tnQ,这真的帮了我♥ –