0

この問題が発生した SO に関する質問に答えていました。

MAX()内で使用できないのはなぜLIMITですか?

SELECT *
FROM table
ORDER BY id DESC
LIMIT 0, MAX(id)

または

SELECT *, MAX(id) AS m
FROM table
ORDER BY id DESC
LIMIT 0, m

どちらも同様の構文エラーになります。

1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'MAX(id)' at line 4

希望のクエリ:

SELECT *
FROM table
ORDER BY id DESC
LIMIT 0, MAX(id)-5
4

5 に答える 5

1

MAX()結果行に対する集計関数ですが、結果行LIMITの数を制限する句です。要するに、結果に含まれる行を決定している間は、結果の行に依存する関数を使用することはできません。これはまったく意味がありません。

documentationによると、LIMIT引数は整数定数または準備されたクエリのパラメーターのいずれかでなければなりません (強調鉱山):

LIMIT1 つまたは 2 つの数値引数を取り、どちらも非負の整数定数でなければなりません(準備済みステートメントを使用する場合を除く)。

構文仕様では、列または関数の使用が許可されていません。値を事前に計算してから、準備されたクエリで使用する必要があります(または文字列置換によって使用しますが、私はそれを避けます)。


質問で指定したクエリに基づいて:

SELECT *
FROM table
ORDER BY id DESC
LIMIT 0, MAX(id)-5

これが実際に必要なクエリだと思います:

SELECT *
FROM table
WHERE id <= (SELECT MAX(id) FROM table) - 5
ORDER BY id DESC

id有効なクエリであっても、列の順序にギャップがある場合 (行が削除された場合など) 、最初に指定したクエリは期待どおりに動作しません。

于 2013-10-25T17:08:00.740 に答える
1

目的の結果を得たい場合の代替手段は、動的 SQL を作成することです。

SET @maxID = (SELECT MAX(ID) FROM tableName);
SET @sql = CONCAT('SELECT *
                   FROM tableName
                   ORDER BY ID DESC
                   LIMIT 0,', @maxID);

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
于 2013-10-25T17:13:09.163 に答える
-1

問題はあなたのクエリにあります::

Select 
* 
from
myTable,
(SELECT MAX(id) as n
FROM table) temp
ORDER BY id DESC
LIMIT 0, temp.n
于 2013-10-25T17:07:53.313 に答える