选择计数和数据

时间:2018-09-27 08:03:34

标签: mysql

我有以下查询,该查询返回的数据限制为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 (

1 个答案:

答案 0 :(得分:2)

您需要在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;

来自Documentation

  

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

     

第二个SELECT返回一个数字,指示第一个SELECT   如果写入时没有LIMIT,SELECT将返回   条款。

性能:

  

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

附加说明: