2

コラムがあります

id
-----
1
32
3
6
5
22
54
21

質問 1: 最初の 3 つのレコードを除く列からすべてのレコードを選択するにはどうすればよいですか?
質問 2: 最後の 3 つのレコードを選択するにはどうすればよいですか?

-ありがとう。

4

4 に答える 4

3

LIMITにはいくつかの制限があるため、基本的にはそのようなクエリをストアド プロシージャに入れる必要があります。プレーン SQL でサブ選択または変数を使用することはできません。ストアド プロシージャでは、変数を使用できます。

これは機能しますが、残念ながら、ストアド プロシージャのサポートが制限されているように見えるため、 sqlfiddleで表示することはできません。

drop procedure if exists all_but_3;

delimiter //
create procedure all_but_3()
begin
   declare v_max bigint unsigned default ~0;
   select * from your_table limit 3, v_max;
end//

delimiter ;

drop procedure if exists last_3;
delimiter //
create procedure last_3()
begin
   declare v_max bigint;
   declare v_mid bigint;
   select count(*) from your_table into v_max;
   set v_mid := v_max - 3;
   select * from your_table limit v_mid, v_max;
end//

delimiter ;

call all_but_3();
call last_3();

InnoDB クラスター化インデックスの詳細

@fthiellaとの他の回答の1つで議論した後、これがどのように機能するかについて詳しく説明することにしました。

エンジンとして InnoDB を使用するテーブルには、常にクラスター化インデックスがあります。いつも。これは、データが InnoDB に格納される方法であり、クラスター化されたインデックスなしでテーブルを作成することは決して不可能です。

InnoDB は、すべての列が null 以外に設定された 1 つまたは最初の一意のインデックスがある場合、主キーを選択します。そのようなインデックスが存在しない場合、 InnoDB は行 ID を持つ非表示の列を作成します。この行 ID は自動インクリメントと同様に機能し、自動インクリメントを使用した非表示の列と考えるのに役立つ場合は、それで問題ないと思います。

さらに、InnoDB は使用されるインデックスに従って行を返します。常にいくつかのインデックスを使用します (データを取得する唯一の方法は、セカンダリ インデックス、クラスター化インデックス、または組み合わせのいずれかを使用することです)。したがって、明示的に作成されたインデックスがない場合、非表示のクラスター化インデックスによって行が返されます。

これは、主キーがなく、一意のインデックスがなく、すべての列が null 以外に設定され、ORDER BY がないテーブルに対するクエリでは、挿入された順序で行が返されることを意味します。

これは、この質問の場合であり、私のものや他の多くの回答のベースです。

これがデータを扱う良い方法だと言っているわけではありません。このソリューションを使用する前に、次のことを考慮する必要があります。

  • クラスター化インデックスとして使用できるインデックスが作成されると、そのインデックスを使用するようにテーブルが書き換えられ、ディスク上のデータが並べ替えられます。インデックスが後で削除されると、元の挿入順序が失われ、取得できなくなります。
  • インデックスが作成された場合、それが一意でなくても、オプティマイザーによって選択されて使用される可能性があり、行は代わりにそのインデックスによって並べ替えられます。

これはすべて文書化されており、5.5 の場合はこのページの 3 番目の箇条書きです。

于 2012-12-29T09:33:02.257 に答える
3
  1. 最初の 3 つのレコードを除くすべてを選択します。

    table1 limit 3、18446744073709551615 から ID を選択します。

  2. 最後の 3 つのレコードを選択します。

    select a.id from (select @row_num:=@row_num+1 as RowNumber,id from table1, (select @row_num:=0) x order by RowNumber desc) を制限として 3;

于 2012-12-29T09:33:43.773 に答える
1

制限を使用


#1 については、理論的には行数を知る必要がありますが、代わりに膨大な数を投入することができます。

SELECT bleh FROM blah LIMIT 3, 18446744073709551615

(18446744073709551615 は可能な最大数です - これを指摘してくれた alex vasi に感謝します)


#2 については、実際にレコード数を知る必要があります。

SELECT bleh FROM blah LIMIT NUM-3, 3

別のクエリから行数を取得する必要があります (NUM があるはずです)。


並べ替えることができる基準がある場合は、完全なカウントを行わずに実際に 2 番目のクエリを実行できます。

SELECT bleh FROM blah ORDER BY field DESC LIMIT 3

私はそうではないと仮定しています。


(テーブルでカウントを行いたくない場合の別のオプションは、すべてのデータを取得し、コードランド [PHP、C など] の最初または最後の 3 行を無視することです。)

于 2012-12-29T09:03:02.843 に答える
-1

これを試して:

totalCounts = SELECT COUNT(*) FROM tbl;

SELECT * FROM tbl LIMIT 3,totalCounts
# Retrieve rows 4 to number of table rows
于 2012-12-29T09:13:05.190 に答える