使用where-in运算符,每个id的desc limit为1

svujldwt  于 2021-06-09  发布在  Cassandra
关注(0)|答案(2)|浏览(405)

我在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子句,因为我不想为所有租户提取,而只为选定的租户提取。

bkkx9g8r

bkkx9g8r1#

干净的解决方案是在一个循环中多次使用查询。您可以在循环中查询以下租户id列表

select * from 
table where tenantd Id =?
ORDER BY  timestamp_sec DESC LIMIT 1

此解决方案的优点:
在cassandra中,使用“in子句”查询是反模式的,因为您试图在同一查询中访问多个分区。在某些情况下,这可能会导致超时。
它不复杂地解决了问题。

ljsrvy3e

ljsrvy3e2#

在Cassandra, LIMIT 1 将只返回整个结果集中1行的结果。
Cassandra还提供 PER PARTITION LIMIT 1 ,它从结果集中的每个分区返回1行。
https://cassandra.apache.org/doc/latest/cql/dml.html#limiting-结果
在你的例子中,你可以做一些

SELECT * 
  FROM system_log_stats.keyspaces_sizes
  WHERE keyspace_name IN ? ORDER BY  timestamp_sec DESC PER PARTITION LIMIT 1

(虽然我不确定order by是否可以同时使用。)

相关问题