我在 cassandra 数据库中订购数据时遇到问题。 这是我的表结构:
CREATE TABLE posts (
id uuid,
created_at timestamp,
comment_enabled boolean,
content text,
enabled boolean,
meta map<text, text>,
post_type tinyint,
summary text,
title text,
updated_at timestamp,
url text,
user_id uuid,
PRIMARY KEY (id, created_at)
) WITH CLUSTERING ORDER BY (created_at DESC)
当我运行此查询时,我收到以下消息:
查询:
select * from posts order by created_at desc;
消息:
ORDER BY is only supported when the partition key is restricted by an EQ or an IN.
或者此查询返回数据而不进行排序:
select * from posts
答案 0 :(得分:4)
您需要了解几件事情, 在您的情况下,分区键是“id”,聚类键是“created_at”。
本质上意味着任何行都将基于“id”的哈希存储在分区中(默认情况下,它取决于您的哈希方案是Murmur3),现在在该分区内,数据根据您的群集键进行排序,在您的情况下“created_at”。
因此,如果您默认查询该表中的某些数据,则会根据您的聚类顺序对结果进行排序,默认排序顺序是您在创建表时指定的顺序。然而,那里有一个陷阱。
如果你没有在WHERE子句中指定分区键,那么结果集的实际顺序则依赖于分区键的散列值(在你的case id中)。
所以为了按特定订单获取帖子。你必须像这样指定分区键
从帖子中选择* WHERE id = 1 order by created_at desc;
注意:
如果所需的排序方向(“ASCending / DESCending”)已经与表定义中的CLUSTERING ORDER匹配,则无需在查询中指定ORDER BY子句。
所以基本上上面的查询与
相同了解更多相关信息从帖子WHERE id = 1
中选择*
答案 1 :(得分:3)
错误消息非常明确:如果不使用ORDER BY
子句限制查询,则不能WHERE
。这是设计的。
在没有WHERE
子句的情况下运行时获得的数据实际 ,而不是使用群集密钥,而是将token function应用于分区键。您可以通过发出以下命令来验证订单:
SELECT token(id), id, created_at, user_id FROM posts;
其中token
函数参数与您的PARTITION KEY 完全匹配。