web-dev-qa-db-ja.com

mysqlテーブルから特定の行を選択する

理想的には、次と同等のクエリが必要です

select * from customer where row_number() = 3

しかし、それは違法です。

自動インクリメントフィールドを使用できません。

row_number()は、選択する必要がある行です。

これについてどうすればいいですか?

編集:まあ、私は練習にiSql * plusを使用していますが、limitとauto_incrementの使用は何らかの理由で違法です。最終的にシーケンスとトリガーを作成し、エントリがあるたびにidを1ずつ増やしました。

24
Nu Gnoj Mik

WHERE row_number() = 3の代わりにLIMIT 2,1を使用できます。

ドキュメント で説明されているように、最初の引数は返す最初の行のオフセットを指定し、2番目は返す行の最大数を指定します

0ベースのインデックスであることに注意してください。したがって、行番号nが必要な場合、最初の引数はn-1。 2番目の引数は常に1になります。1行だけが必要なためです。たとえば、テーブルcustomerの行番号56が必要な場合:

SELECT * FROM customer LIMIT 55,1
61
sp00m

そのような行を選択することはできません。値がになるのフィールドを指定する必要があります

比較するフィールドがidである場合に機能するクエリを次に示します。

select * from customer where `id` = 3
4
Starx
SET @customerID=0;
SELECT @customerID:=@customerID+1 AS customerID
FROM CUSTOMER ;

このようなSQLからデータセットを取得し、それをJavaデータ構造(リストなど)に入力し、そこで必要なソートを行うことができます(おそらく、同等のインターフェースの助けを借りて)

4
Sanath

SQLテーブルはデフォルトでは順序付けられておらず、順序付けされていない行セットからn番目の行を要求しても意味がありません。ORDERBYを指定しない限り、毎回異なる行を返す可能性があるためです。

select * from customer order by id where row_number() = 3

(MySQLテーブルは内部順序で表示される場合がありますが、この動作に依存することはできません)。次に、LIMIT offset, row_countを0ベースのオフセットで使用して、行番号3がオフセット2になるようにします。

select * from customer order by id
limit 2, 1

または、LIMIT row_count OFFSET offsetを使用できます。

select * from customer order by id
limit 1 offset 2
1
fthiella

自動生成されたIDフィールドをテーブルに追加し、このIDで選択できます

SELECT * FROM CUSTOMER WHERE CUSTOMER_ID = 3;
1
duncanportelli

理想的にはAUTO_INCREMENT属性を持つ一意のIDフィールドを使用して、テーブルを作成する必要があります。例:

CREATE TABLE Persons
(
P_Id int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
PRIMARY KEY (P_Id)
)

次に、このテーブルの3番目のレコードにアクセスできます。

SELECT * FROM Persons WHERE P_Id = 3
1
Luminous_Path