2015-12-10 75 views
0

我插入来自多个用户的消息,并希望获取属于按“创建”字段降序排列的用户的子选择的最后消息。订购结果带有IN限制Pk

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) 

MY QUERY:

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

请指教。谢谢!

回答

0

您可以通过查询by子句加入顺序,例如实现自己的目标,

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柱将在相对于该分区键降序排列的给定的顺序(顺序的查询在子句)进行检索。


您可以挖掘更多的信息,如果你知道如何CQL3 Maps to Cassandra's Internal Data Structure.(Refer slides from 43)的。但是如果它会影响性能的话。通过考虑这些影响来设计您的模式。

+0

HI再也 #1没有工作对我来说,因为我使用手动分页的无限滚动,结果我得到一个错误 _“与ORDER BY和在限制不能两个页面查询在分区键;你必须删除ORDER BY或IN和排序客户端,或禁用分页查询“# # #2将不会工作以及我的用例。 (必须提交作为第二条评论 - 长度) – doharlem

+0

对不起,我应该提供更多的上下文。建立一个Facebook墙的模拟:朋友的帖子被拉为一个时间线,所以我的要求归结为: 1.我应该获取指定的一组朋友的帖子,对于每个用户不同(因此尝试IN)。 2.按时间反向排序。 3.需要分页。 关于IN性能打点完全有道理。 无法围绕不同的方法包裹我的头,并希望避免使用图形数据库构建所有内容。 有一种感觉我失去了一些简单明了的东西... 任何想法都非常感激! – doharlem

+0

您正在使用哪个版本的cassandra和cassandra驱动程序? –