mysql - 为什么 LIMIT 和 OFFSET 在 mysql 脚本中不起作用?
问题描述
我正在尝试以下 mysql 脚本,但它说NumOfRecords
并Offsetpage
没有定义。
SET @NumOfRecords = 10;
SET @Offsetpage = 0;
SET @DocumentStatus = 'PENDING';
SELECT * FROM documents WHERE DOCUMENT_VERIFICATION_STATUS = @DocumentStatus ORDER BY DOCUMENT_UPLOADED_DATE DESC LIMIT @NumOfRecords OFFSET @Offsetpage
有什么帮助吗?
解决方案
LIMIT
不支持子句中的用户变量。
https://dev.mysql.com/doc/refman/8.0/en/user-variables.html说:
用户变量可以在大多数允许表达式的情况下使用。这目前不包括明确需要文字值的上下文,例如在语句的
LIMIT
子句SELECT
或语句的IGNORE N LINES
子句中LOAD DATA
。
换句话说,您必须使用文字整数,否则您可以使用准备好的语句:
PREPARE stmt FROM 'SELECT * FROM documents WHERE DOCUMENT_VERIFICATION_STATUS = ? ORDER BY DOCUMENT_UPLOADED_DATE DESC LIMIT ? OFFSET ?';
EXECUTE stmt USING @DocumentStatus, @NumOfRecords, @Offsetpage;
您不必为此使用存储过程,您可以直接在任何数据库会话中执行准备好的语句。
您可以直接在大多数客户端 API 中运行准备好的语句,而无需使用PREPARE
andEXECUTE
语法。您也不必定义用户变量。
例如,在 PHP 中:
<?php
$stmt = $pdo->prepare('SELECT * FROM documents WHERE DOCUMENT_VERIFICATION_STATUS = ? ORDER BY DOCUMENT_UPLOADED_DATE DESC LIMIT ? OFFSET ?');
$stmt->execute( [ 'PENDING', 10, 0 ] );
推荐阅读
- json - BotFramework Composer 使用 FactSet 显示多个数据
- mysql - 如何在存储过程的json字符串中添加变量?
- python - TodoList 的紧迫性
- linux - 需要帮忙!如何在启用陷阱的情况下构建 Ghostscript?ENABLE_TRAPPING
- excel - Excel 公式 - 脚本
- python - 情节图没有属性“full_figure_for_development”
- visual-studio-2019 - 为什么在FCL中使用fcl::continuousCollide会报错?
- reactjs - 第一次后无法重新启动我的反应项目
- flutter - 基于变量变化的动画文本小部件内容
- python - 如何在 discord.py 中创建冷却时间留言