首页 > 解决方案 > 选择计数和数据

问题描述

我有以下查询,它返回限制为 5 的数据。

SELECT a.* FROM (
    SELECT category, description, price, date_added, datetime_created
    FROM vc_expense e1
    WHERE trip_id=:trip_id AND description LIKE :search
    UNION ALL
    SELECT category, description, NULL, NULL, NULL
    FROM vc_expense_default e2
    WHERE description LIKE :search
) AS a
GROUP BY description, price
ORDER BY CASE
    WHEN price IS NOT NULL THEN 1
    WHEN description LIKE :search_start THEN 2
    WHEN description LIKE :search THEN 3
    ELSE 4
END, datetime_created DESC, date_added DESC
LIMIT 5

一切都按预期工作,但我还想包括在 LIMIT之前还返回了多少项目。这样的事情会很好:

{
    count: 32,
    data: [items, limited to 5]
}

我试过以下没有运气:

SELECT COUNT(a.*) AS count, a.* AS data FROM (

标签: mysql

解决方案


您需要在 Select 语句期间使用FOUND_ROWS()并调用。SQL_CALC_FOUND_ROWS没有SQL_CALC_FOUND_ROWS被调用,FOUND_ROWS()只会返回 5(你的限制)。

使用以下内容:

SELECT SQL_CALC_FOUND_ROWS a.* FROM (
    SELECT category, description, price, date_added, datetime_created
    FROM vc_expense e1
    WHERE trip_id=:trip_id AND description LIKE :search
    UNION ALL
    SELECT category, description, NULL, NULL, NULL
    FROM vc_expense_default e2
    WHERE description LIKE :search
) AS a
GROUP BY description, price
ORDER BY CASE
    WHEN price IS NOT NULL THEN 1
    WHEN description LIKE :search_start THEN 2
    WHEN description LIKE :search THEN 3
    ELSE 4
END, datetime_created DESC, date_added DESC
LIMIT 5

触发此查询后,您需要触发另一个查询,以获取总行数。

SELECT FOUND_ROWS() AS overall_count_without_limit;

文档

一个 SELECT 语句可能包含一个 LIMIT 子句来限制服务器返回给客户端的行数。在某些情况下,希望知道在没有 LIMIT 的情况下该语句将返回多少行,但无需再次运行该语句。要获取此行数,请在 SELECT 语句中包含 SQL_CALC_FOUND_ROWS 选项,然后调用 FOUND_ROWS()

第二个 SELECT 返回一个数字,表示如果没有 LIMIT 子句,第一个 SELECT 将返回多少行。

表现:

如果您使用 SELECT SQL_CALC_FOUND_ROWS,MySQL 必须计算完整结果集中有多少行。但是,这比在没有 LIMIT 的情况下再次运行查询要快,因为不需要将结果集发送到客户端。

补充说明:


推荐阅读