select - 在 CQL Cassandra 中查找非主键列的不同值

标签 select cassandra distinct cql cql3

我使用以下代码创建表:

CREATE KEYSPACE mykeyspace
WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };
USE mykeyspace;
CREATE TABLE users (
  user_id int PRIMARY KEY,
  fname text,
  lname text
);
INSERT INTO users (user_id,  fname, lname)
  VALUES (1745, 'john', 'smith');
INSERT INTO users (user_id,  fname, lname)
  VALUES (1744, 'john', 'doe');
INSERT INTO users (user_id,  fname, lname)
  VALUES (1746, 'john', 'smith');

我想找到 lname 的不同值列(不是 PRIMARY KEY)。我想得到以下结果:
 lname
-------
 smith

通过使用 SELECT DISTINCT lname FROM users;然而自从 lname不是 PRIMARY KEY我收到以下错误:
InvalidRequest: code=2200 [Invalid query] message="SELECT DISTINCT queries must
only request partition key columns and/or static columns (not lname)"
cqlsh:mykeyspace> SELECT DISTINCT lname FROM users;

如何从 lname 获取不同的值?

最佳答案

用户 - Undefined_variable - 提出两个好观点:

  • 在 Cassandra 中,您需要构建数据模型以匹配您的查询模式。这有时意味着将数据复制到其他表中,以获得所需的查询灵活性级别。
  • DISTINCT仅适用于分区键。

  • 因此,使其工作的一种方法是构建一个特定的表来支持该查询:
    CREATE TABLE users_by_lname (
        lname text,
        fname text,
        user_id int,
        PRIMARY KEY (lname, fname, user_id)
    );
    

    现在,在我将您的 INSERT 运行到这个新查询表后,这有效:
    aploetz@cqlsh:stackoverflow> SELECT DISTINCT lname FROm users_by_lname ;
    
     lname
    -------
     smith
       doe
    
    (2 rows)
    

    注意:在此表中,所有具有相同分区键( lname )的行将按 fname 排序, 如 fname是一个聚类键。我加了 user_id作为额外的聚类键,只是为了确保唯一性。

    关于select - 在 CQL Cassandra 中查找非主键列的不同值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35840493/

    相关文章:

    php - 具有多个字段的 MySql Distinct

    mysql - 删除mysql中的重复行

    java - 组合表单和选择

    cassandra - 无法使用本地主机连接到我的 Cassandra

    full-text-search - 键值存储数据库是全文搜索存储的好选择吗?

    java - Apache Cassandra 3.10 IllegalArgumentException - Murmur3Partitioner 的 token 无效

    r - 根据 `r` 中具有反向字符串值的两列过滤不同的值

    mysql - 如何使用 where in 选择所有具有相同 id 的数据

    jquery - jQuery替换选择选项

    mysql - 如何选择与另一个值不关联的值?