2

私は動的SQLクエリを持っています:

SET @a=(SELECT MAX(ID) FROM table);
PREPARE STMT FROM 'SELECT * FROM table ORDER BY id DESC LIMIT 0, ?';
EXECUTE STMT USING @a;

それは期待どおりに正しく機能します。ただし、このクエリから最後の 5 行を減算したいと思います。

そこで、次の 2 つの方法を使用しました。

1-SET @a=(SELECT (MAX(ID)-5) FROM table);

2-SET @a := @a-5;

ここで奇妙なことは、実行されますが、結果はそのままのクエリと何の違いもなく、すべての行がフェッチされるということです!

このトピックに関する説明は本当にありがたいです。

更新 #1

結果が同じであるように、より大きな数20に変更しても、最後の行にギャップはありません。5200

アップデート #2

SELECT COUNT(*), MAX(ID) FROM table&の出力211_COUNT(*)577MAX(ID)

したがって、変更5すると機能しますが、結果から最初のID400が除外されます。また、この除外方法は@Laurenceの回答にも当てはまります。 34

アップデート #3

これらの ID をtableテーブル内の合計行と見なします。

| ID |
+----+
| 55 |
| 54 |
| 53 |
| 52 |
| 51 |

クエリへの以下の変更に関する結果を参照してください (順序は、私が定義した DESC です)。

# @a is MAX(id) = 55

SET @a := @a-5;
    => query: SELECT * FROM table ORDER BY id DESC LIMIT 0, 55-5/*50*/ -- no effects in result

SET @a := @a-50;
    => query: SELECT * FROM table ORDER BY id DESC LIMIT 0, 55-50/*5*/ -- no effects in result

SET @a := @a-51;
    => query: SELECT * FROM table ORDER BY id DESC LIMIT 0, 55-51/*4*/ -- will exclude row `51` from the result so `55, 54, 53, 52` are fetched 
4

1 に答える 1

0

上位 5 つの ID を除外し、ID の降順で結果を並べ替えたいようです。これを行うには、制限を 5 から開始します。

Set @a = (Select Count(*) From table);
Prepare stmt From 'Select * From table Order By id desc Limit 5, ?';
Execute stmt Using @a;

これがどのように機能するかを確認するには、制限が適用される前の結果 (id のみ) を想像してください。

55, 54, 53, 52, 51, 50, 49, ...

Limit 5, n6番目から始まるn行を返すように言います。つまり

50, 49, ...

ここ@aでは、すべての結果を取得するのに十分な大きさが必要です。非常に大きな数を使用するだけで、正確さを気にする必要はありません。id が一意であると仮定するmax(id)count(*)、この場合はそうします。

于 2013-10-27T15:31:08.243 に答える