获取总行数、唯一 ID 和带有 LIMIT 的结果集

问题描述 投票:0回答:1

我正在构建一个在前端分页的数据表,该表包含高级过滤和排序以及可选的列可见性。还可以对表中选定的行执行操作。表中的数据是延迟加载的,因此我的后端仅在 SQL 中使用 LIMIT 10 子句返回 10 行。

我的前端需要 3 点数据:

  1. 包含 10 行的结果集
  2. 无LIMIT的记录总数(分页)
  3. 整个结果集的唯一 ID(对于选中“全选复选框”时的操作。

通过执行查询并执行 LIMIT 10 OFFSET 0 逻辑检索第一个点。

第二个点可以通过在查询顶部添加

SQL_CALC_FOUND_ROWS
来检索,然后立即执行
SELECT FOUND_ROWS();

第三点,我似乎无法再使用查询来获取此数据,该查询为我提供了步骤 1 和步骤 2 的结果。

这是一个非常大的查询,其中包含相当多的逻辑,因此对于我的场景来说,执行此查询两次以获得 3 个结果集并不理想。

这是我前两点的代码(非常简化的版本,但查询中的连接和其他逻辑在这里并不重要):

SELECT SQL_CALC_FOUND_ROWS *
FROM (SELECT *
        FROM user
        GROUP BY id) AS subq
LIMIT 2 OFFSET 0;
SELECT FOUND_ROWS();

对于第三点,我会执行以下查询:

SELECT DISTINCT(id)
FROM user
GROUP BY id

是否可以在第一个查询内的某个位置执行第三个查询?例如,它可能只是一个 GROUP_CONCAT,它以逗号分隔的字符串形式返回所有 id,或者我可以在 Nodejs 后端中使用和解析的东西?

sql mysql mariadb
1个回答
0
投票

我会等待获取所有 id,直到他们选择全部(如果数据已更改,可能会找到不同的 id 集/计数)。

但是如果您确实想这样做,则不需要单独的计数,因为您只需检查返回的行数即可。我将使用 cte 作为您的主查询,按照您想要的顺序生成您想要的所有 id,如下所示(假设表 t 按 t.x 排序):

with all_ids as (
    select id, row_number() over () rn from t order by x
),
selected_ids as (
    select id from all_ids order by rn limit 10
)
select all_ids.id, t.*
from all_ids
left join selected_ids using (id)
left join t on t.id=selected_ids.id
order by t.id is null,rn
© www.soinside.com 2019 - 2024. All rights reserved.