4

すでにいくつかの投稿があることは知っていますが、競合しているものもあります。

数千のエントリを持つテーブルを継承したプロジェクトを引き受けました。

問題は、テーブルに自動インクリメントIDフィールドがなく、そこに入力された最後の300行を抽出するように求められたことです。

テーブルから最後の300エントリを抽出することは可能ですか?「システム行ID」はありますか?

4

3 に答える 3

3

厳密な答えは、日付または順序を示す何かがない限り、「いいえ」です。テーブルは本質的に順不同です。

実際には、通常、データを入れた順序でフェッチして戻します。「1 つのプロセッサと 1 つのディスクのみを備えたシステムに、データを 1 回ロードしただけで、その後の挿入は行わなかった」という記述が真実であるほど、可能性が高くなります。データが実際に整っていること。

削除とその後の挿入が発生する可能性があるため、システム行 ID を持つことは役に立ちません。この場合、後のレコードは前のページに配置されます。

小さなテーブルがあります。select *を実行し、データをスプレッドシートにコピーして、そこから作業を行います。

または、行番号が増加するテーブルを選択し、別のテーブルに挿入して、そこから選択することもできます。この疑似コードのようなもの:

insert into NewTable (seqnum, cols)
    select :rownum=:rownum+1, cols
    from YourTable

欲しいものが手に入るチャンスがあります。

最後に 1 点。 挿入を行い、挿入以降のログ ファイルがある場合は、そこから情報を取得できる可能性があります。少しの作業で。

于 2013-01-17T19:54:34.227 に答える
2

これを試して:

SELECT col1, col2, ... 
FROM (SELECT col1,col2, ..., (@auto:=@auto+1) indx 
      FROM tablename, (SELECT @auto:=1) AS a
     ) AS b 
ORDER BY indx DESC 
LIMIT 30
于 2013-01-17T20:01:00.110 に答える
0

少なくともテーブルにレコード挿入時間があれば、これを使用できます。それ以外の場合はできません。

SELECT * FROM 
yourtable 
ORDER BY inserted_time desc limit 300;
于 2013-01-17T19:54:53.303 に答える