我开始使用Cassandra,但我在“订购”或“选择”方面遇到了一些问题。
CREATE TABLE functions (
id_function int,
sort int,
id_subfunction int,
php_class varchar,
php_function varchar,
PRIMARY KEY (id_function, sort, id_subfunction)
);
这是我的桌子。
如果我执行此查询
SELECT * FROM functions WHERE id_subfunction = 0 ORDER BY sort;
这就是我得到的。
Bad Request: ORDER BY is only supported when the partition key is restricted by an EQ or an IN.
我做错了什么?
由于
答案 0 :(得分:2)
PRIMARY KEY (id_function, sort, id_subfunction)
在Cassandra CQL中,复合PRIMARY KEY中的列是分区键或 clustering 键。在您的情况下,id_function
(列出的第一个键)是分区键。这是哈希值的关键值,以便您的数据可以均匀地分布在群集上。
其余列(sort
和id_subfunction
)称为群集列,用于确定分区中数据的排序顺序。这实际上意味着,只有在WHERE
子句中首次指定分区键时,您的数据才会按集群键进行排序。
您有两种选择:
1)通过id_function
查询此表:
SELECT * FROM functions WHERE id_function= 0 ORDER BY sort;
这在技术上会起作用,虽然我猜测它不会给你提供你想要的结果。
2)更好的选择是创建一个"查询表。"这是一个专门用于id_subfunction
处理您的查询的表格。它仅与原始functions
表的不同之处在于,PRIMARY KEY定义为id_subfunction
作为分区键:
CREATE TABLE functionsbysubfunction (
id_function int,
sort int,
id_subfunction int,
php_class varchar,
php_function varchar,
PRIMARY KEY (id_subfunction, sort, id_function)
);
此查询表将允许此查询按预期运行:
SELECT * FROM functionsbysubfunction WHERE id_subfunction = 0;
除非您想指定ASCending或DESCending订单,否则您不需要指明ORDER BY
。
请记住,使用Cassandra,根据您想要查询数据的方式设计数据模型非常重要。这可能不一定是最初存储它的方式。