我从多个用户插入消息,并希望获得属于用户子选择的最后消息,这些消息按照"创建的"降序排序。字段。
MY TABLE(通过" user_id IN(...)"获取消息):
CREATE TABLE users (
user_id timeuuid,
created timestamp,
msg text,
PRIMARY KEY ((user_id), created)
)
WITH CLUSTERING ORDER BY (created DESC)
我的查询:
cqlsh:fb> SELECT user_id,created,msg FROM posts WHERE user_id IN (657818d6-9c7e-11e5-b392-978fb134d9c9,e2028f98-9c57-11e5-b96c-8863dfc615b7);
结果按"创建"排序仅在每个" user_id"的一组消息中,见下文(划分2个不同用户的红线)。
但是我希望将整个结果排序为"创建DESC",即"最后一个"应该是最重要的。
请指教。谢谢!
答案 0 :(得分:0)
您可以在查询中添加 order by clause 来实现目标,例如,
SELECT user_id,created,msg FROM posts WHERE user_id IN (657818d6-9c7e-11e5-b392-978fb134d9c9,e2028f98-9c57-11e5-b96c-8863dfc615b7) order by created DESC;
以下是一些不同的查询案例及其结果说明。
案例1: 如果您没有提供订单子句和 IN子句,则默认情况下它将如下工作。
SELECT user_id,created,msg FROM posts;
分区键顺序取决于您的partitioner type。在上面的查询user_id
是分区键,这些分区键顺序基于您的分区类型。因此,如果您的分区程序是Murmur3Partitioner,则将以user_id
的哈希顺序检索结果,并在created
中检索descending order with respect to the user_id
列。
案例2: 如果在 IN子句中提供分区键但不在ORDER BY子句中提供。
SELECT user_id,created,msg FROM posts WHERE user_id IN (657818d6-9c7e-11e5-b392-978fb134d9c9,e2028f98-9c57-11e5-b96c-8863dfc615b7);
然后,将按照user_id
分区键和created
列的给定顺序(查询具有in子句的顺序)检索结果,该列将按照分区键的降序排列。
如果您了解CQL3 Maps to Cassandra's Internal Data Structure.(Refer slides from 43)的方式,可以挖掘更多信息。但是,如果partition key is passed IN clause它会对性能产生影响。通过考虑这些影响来设计您的架构。