对Pk进行IN限制的订购结果

时间:2015-12-10 02:34:45

标签: cassandra

我从多个用户插入消息,并希望获得属于用户子选择的最后消息,这些消息按照"创建的"降序排序。字段。

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",即"最后一个"应该是最重要的。

enter image description here

请指教。谢谢!

1 个答案:

答案 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它会对性能产生影响。通过考虑这些影响来设计您的架构。