我正在尝试获取数据并以分页的形式显示在表中。因此,我为此使用了限制和偏移量,但是我也需要不显示可以从该查询中获取的行。有没有办法做到这一点。 我尝试过
resultset.last() and getRow()
select count(*) from(query) myNewTable;
这两种情况我得到正确的答案,但这是正确的方法吗?性能是一个问题
答案 0 :(得分:0)
我们可以使用以下代码获取有限的记录,
首先,我们需要在下方设置所需的记录数量
var limit = 10;
之后,此限制发送到以下语句
WITH
Temp AS(
SELECT
ROW_NUMBER() OVER( primayKey DESC ) AS RowNumber,
*
FROM
myNewTable
),
Temp2 AS(
SELECT COUNT(*) AS TotalCount FROM Temp
)
SELECT TOP limit * FROM Temp, Temp2 WHERE RowNumber > :offset order by RowNumber
这同时在MSSQL和MySQL中运行
答案 1 :(得分:0)
没有简单的方法可以做到这一点。
1。。您发现,通常可以归结为执行两个查询:
执行具有限制和偏移量的SELECT
以便获取所需的数据。
执行COUNT(*)
以便计算总页数。
此方法可能适用于行数不多的表,或者在索引的列上过滤数据(对COUNT
和SELECT
查询进行数据过滤时)。
2。。如果表很大,但是您需要显示的数据只占表中数据的百分比 ,并且该数据具有共同的特征(例如,您所有页面中的数据都是在一天之内创建的),您可以使用partitioning。在单个分区上执行COUNT
和SELECT
比在整个表上执行它们要快得多。
3。。您可以创建另一个表,该表将存储COUNT
查询的值。
例如,假设您的 big_table 表如下所示:
id | user_id | timestamp_column | text_column | another_text_column
现在,您的SELECT
查询看起来像这样:
SELECT * FROM big_table WHERE user_id = 4 ORDER BY timestamp_column LIMIT 20 OFFSET 20;
您的计数查询:
SELECT COUNT(*) FROM table WHERE user_id = 4;
您可以创建一个具有以下格式的 count_table :
user_id | count
使用系统中的当前数据填充此表后,您将创建一个触发器,该触发器将在 big_table 的每次插入或更新时更新此表。
这样,计数查询将非常快,因为它将在 count_table 上执行,例如:
SELECT count FROM count_table WHERE user_id = 4
此方法的缺点是 big_table 中的插入会变慢,因为触发器会在每次插入时触发并更新 count_table 。
这是您可以尝试的方法,但最终,这完全取决于数据的大小和类型。