我是Cassandra和这个论坛的新手。我正在使用cqlsh执行Cassandra查询,但我不知道如何使用Cassandra执行类似sql select distinct a, b, c from table order by d asc
之类的查询。我能怎么做?表格的结构是什么?
答案 0 :(得分:0)
您的primary key
由partition keys
和clustering columns
组成。
假设我们有一个如下的示例表,
CREATE TABLE Sample (
field1 text,
field2 text,
field3 text,
field4 text,
PRIMARY KEY ((field1, field2), field3));
DISTINCT要求所有分区键都以逗号分隔的形式传递。
因此您无法运行此查询select distinct field1 from Sample;
。有效表达式为select distinct field1, field2 from Sample;
。
它会在内部访问群集中的所有节点以查找所有分区键,因此,如果表中有数百万个分区,那么我期望多个节点的性能都会下降。
默认情况下,field3的记录将按升序排列。下面的查询将按字段3的降序提供记录。
select * from Sample where field1 = 'a' and field2 = 'b' order by field3 desc;
如果您已经知道查询模式以及需要对数据进行排序的方式,则可以以这种方式设计表。假设您总是需要field3的降序记录,则可以通过这种方式设计表。
CREATE TABLE Sample (
field1 text,
field2 text,
field3 text,
field4 text,
PRIMARY KEY ((field1, field2), field3))
WITH CLUSTERING ORDER BY (field3 DESC);
现在不按顺序查询将得到相同的结果。
您可以对多个群集列使用order by。但是您不能跳过订单。要了解下面的示例表,
CREATE TABLE Sample1 (
field1 text,
field2 text,
field3 text,
field4 int,
field5 int,
PRIMARY KEY ((field1, field2), field3, field4));
您可以按select * from Sample1 where field1 = 'a' and field2 = 'b' order by field3 desc, field4 desc;
这样的多列使用订单
注意:所有字段必须为正序(field3 asc, field4 asc
)或负序(field3 desc, field4 desc
)。您不能(field3 asc, field4 desc
)做,反之亦然。
通过编写,我们不能按顺序跳过顺序,我的意思是我们不能做类似select * from Sample1 where field1 = 'a' and field2 = 'b' order by field4 desc;
的事情
我希望这会有所帮助!