我正在构建一个在前端分页的数据表,该表包含高级过滤和排序以及可选的列可见性。还可以对表中选定的行执行操作。表中的数据是延迟加载的,因此我的后端仅在 SQL 中使用 LIMIT 10 子句返回 10 行。
我的前端需要 3 点数据:
通过执行查询并执行 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 后端中使用和解析的东西?
我会等待获取所有 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