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 (
解决方案
您需要在 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 的情况下再次运行查询要快,因为不需要将结果集发送到客户端。
补充说明:
- 你应该避免使用
SELECT *
. 阅读:为什么 SELECT * 被认为是有害的? - 此外,无论何时使用
GROUP BY
,您的 SELECT 列表都应仅包含那些在功能上依赖于 GROUP BY 子句中的列和/或聚合列/表达式的列。阅读:在 MySql 中执行查询时与 only_full_group_by 相关的错误 - 在较新版本的 MySQL ( version >= 5.7.5 ) 中,此查询将抛出错误
推荐阅读
- javascript - 反应一个状态数据自动变化
- javascript - Javascript 将数据表导出到 csv 但想要包含表头并排除三列
- python - 如何根据另一个表的检查替换熊猫数据框中列中的值
- sql-server - 如果 where 子句匹配,则获取最后一个对应条目并匹配
- c# - 从 .NET 浏览的命名空间列表中删除 MyCompany.Task
- firebase - 是否可以只允许经过身份验证的用户使用可调用函数,而不会因无效调用而收费?
- unix - 来自单行环境变量的私有 ssh 密钥
- r - 使用基于行的过滤器进行多项操作的汇总
- javascript - 部署后反应白屏,错误 404 chunk.js
- react-native - 将“导航”和“道具”传递给子组件