【问题标题】:Cassandra cql select last N comments from each usersCassandra cql 从每个用户中选择最后 N 条评论
【发布时间】:2015-11-03 23:02:55
【问题描述】:

我有以下表格:

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

假设任务是检索用户Alice、'Bob' 和Charlie 的最后10 个cmets,返回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]

【问题讨论】:

  • 这其实不傻...一次对一个分区键运行查询更有效。

标签: cassandra cql cql3


【解决方案1】:

三个单独的查询是一个很好的方法。理想情况下,您应该同时运行它们。

您可能还知道 IN 子句,您可以使用它在单个语句中查询所有用户。

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

但是,LIMIT 将适用于所有用户,因此任何这些用户都会产生 10 个。对于这种模式,您可能对ticket for allowing per-partition limits 感兴趣(在撰写本文时尚未完成)。

【讨论】:

  • 好答案。我唯一要补充的就是
  • 我想你在那儿被切断了。 :) 我想听听你的想法。
  • 很抱歉。我要澄清的是,在使用 IN 时,结果不会按照它们的聚类顺序排序,但它确实是一个很好的解决方案。
猜你喜欢
  • 2014-11-27
  • 2015-03-16
  • 2023-03-10
  • 2011-12-26
  • 2016-08-03
  • 2010-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多