我有以下查询,该查询返回的数据限制为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 (
答案 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;
SELECT语句可以包含LIMIT子句以限制数量 服务器返回给客户端的行数。在某些情况下, 希望知道该语句将返回多少行 没有LIMIT,但没有再次运行该语句。获得 此行计数,请在SELECT中包含一个SQL_CALC_FOUND_ROWS选项 语句,然后再调用FOUND_ROWS()
第二个SELECT返回一个数字,指示第一个SELECT 如果写入时没有LIMIT,SELECT将返回 条款。
性能:
如果您使用的是SELECT SQL_CALC_FOUND_ROWS,MySQL必须计算 完整的结果集中有很多行。但是,这比 在没有LIMIT的情况下再次运行查询,因为结果集不需要 发送给客户。
附加说明:
SELECT *
。阅读:Why is SELECT * considered harmful? GROUP BY
时,SELECT列表应仅包含在功能上取决于GROUP BY子句中的列和/或汇总的列/表达式的那些列。阅读:Error related to only_full_group_by when executing a query in MySql