微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

对每个ID使用WHERE IN运算符,DESC LIMIT 1

如何解决对每个ID使用WHERE IN运算符,DESC LIMIT 1

我在Cassandra中有一个表,该表存储租户的最新更新的详细信息。 有一个时间戳字段可更新使用情况。我需要找到每个租户的最新更新细节。 因此,考虑表结构如下:

enter image description here

现在,我需要这样的输出

enter image description here

我写了这样的查询

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

此解决方案的优势:

  1. 在Cassandra中使用“ IN子句”查询是反模式,因为您试图在同一查询中访问多个分区。在某些情况下,这可能会导致超时。
  2. 它无需复杂性即可解决目的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。