2015-11-03 65 views
2

我有下面的表中選擇最後N個評論:卡桑德拉CQL從每個用戶

CREATE TABLE user_comment (
    username text, 
    time timestamp, 
    comment text, 
    PRIMARY KEY (username, time) 
) WITH CLUSTERING ORDER BY (time DESC); 

假設一個任務是獲取來自用戶的Alice的最後10個評論,「鮑勃」和Charlie,返回3 * N個記錄。查詢應該如何形成?

我現在正在做的是發出3查詢

SELECT * FROM user_comment WHERE username = 'Alice' limit 10; 
SELECT * FROM user_comment WHERE username = 'Bob' limit 10;` 
SELECT * FROM user_comment WHERE username = 'Charlie' limit 10; 

和連接的結果。

但這看起來很愚蠢。有更有效的方法嗎?

我使用:

> show VERSION ; 
[cqlsh 5.0.1 | Cassandra 2.1.8 | CQL spec 3.2.0 | Native protocol v3] 
+1

這實際上並不愚蠢......一次在一個分區鍵上運行查詢會更有效。 – jny

回答

3

三個單獨的查詢是該罰款的做法。理想情況下,你會同時運行它們。

您可能還會注意到IN子句,您可以使用該子句在單個語句中查詢所有用戶。

SELECT * FROM user_comment WHERE username IN ('Alice', 'Bob', 'Charlie') LIMIT 10; 

但是,LIMIT將適用於所有,所以它會導致10個來自任何這些用戶。對於這種模式,您可能對ticket for allowing per-partition limits感興趣(截至撰寫本文時尚未完成)。

+0

很好的答案。我唯一想補充的,就是 – Aaron

+0

我認爲你在那裏被切斷了。 :) 我想聽聽你的想法。 –

+0

對不起。我要澄清的是,使用IN時結果不會按照它們的聚類順序排序,但它確實是一個很好的解決方案。 – Aaron