如何解决对每个ID使用WHERE IN运算符,DESC LIMIT 1
我在Cassandra中有一个表,该表存储租户的最新更新的详细信息。 有一个时间戳字段可更新使用情况。我需要找到每个租户的最新更新细节。 因此,考虑表结构如下:
现在,我需要这样的输出:
我写了这样的查询:
aQueries = ['t1','t2','t3'];
const query = `SELECT *
FROM system_log_stats.keyspaces_sizes
WHERE keyspace_name IN ? ORDER BY timestamp_sec DESC LIMIT 1`;
const res = await client.execute(query,[aQueries],{ prepare: true});
但是上面的查询仅返回1个结果。
请注意,我必须使用where IN子句,因为我不希望获取所有租户,而仅获取选定的租户。
解决方法
在Cassandra中,LIMIT 1
仅返回整个结果集中的1行结果。
Cassandra还提供了PER PARTITION LIMIT 1
,它从结果集中的每个分区返回1行。
https://cassandra.apache.org/doc/latest/cql/dml.html#limiting-results
在您的示例中,您可以执行类似的操作
SELECT *
FROM system_log_stats.keyspaces_sizes
WHERE keyspace_name IN ? ORDER BY timestamp_sec DESC PER PARTITION LIMIT 1
(尽管我不确定ORDER BY是否可以同时使用。)
,干净的解决方案是在循环中多次使用查询。您可以在循环中查询以下Tenenat ID的列表
select * from
table where tenantd Id =?
ORDER BY timestamp_sec DESC LIMIT 1
此解决方案的优势:
- 在Cassandra中使用“ IN子句”查询是反模式,因为您试图在同一查询中访问多个分区。在某些情况下,这可能会导致超时。
- 它无需复杂性即可解决目的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。