为什么LIMIT和OFFSET在mysql脚本中不起作用?

时间:2018-12-31 17:37:56

标签: mysql

我正在尝试以下mysql脚本,但是它说NumOfRecordsOffsetpage未定义。

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

有帮助吗?

1 个答案:

答案 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中运行准备好的语句,而无需使用PREPAREEXECUTE语法。您也不必定义用户变量。

例如,在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 ] );