2016-11-09 31 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,這真的幫了我♥ –