我正在尝试以下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
有帮助吗?
答案 0 :(得分:2)
LIMIT
子句中的用户变量不受支持。
https://dev.mysql.com/doc/refman/8.0/en/user-variables.html说:
用户变量可以在大多数允许表达式的上下文中使用。当前,这不包括明确需要文字值的上下文,例如
LIMIT
语句的SELECT
子句或IGNORE N LINES
语句的LOAD DATA
子句。< / p>
换句话说,您必须使用文字整数,否则可以使用准备好的语句:
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
和EXECUTE
语法。您也不必定义用户变量。
例如,在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 ] );