質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

6回答

7362閲覧

一つ前のレコードIDを取得したい

ozaki566

総合スコア29

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

3クリップ

投稿2018/07/30 02:26

お世話になります。

ID:1
ID:3
ID:8

というIDに規則性のないデータが3つあったとします。

SELECT id FROM `sample` WHERE id = 8 ORDER BY id DESC LIMIT 1

でID=8を得たとき、一行のSQLでその一つ前のデータ(ID=3)も取得することは可能でしょうか?

それとももう一度SQLを書くしかないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

ID=8の一つ前のデータのみ取得するなら、

SQL

1SELECT * FROM sample 2WHERE id < 8 3order by id desc limit 1

ID=8と一つ前のデータを取得するなら、

SQL

1SELECT * FROM sample 2WHERE id <= 8 3order by id desc limit 2

投稿2018/07/30 02:59

編集2018/07/30 03:02
sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

SQL

1WHERE id = 8

の段階でその他のデータは取得できていませんので、
一つ前という概念自体ありません。

改めてSQLを発行する以外ありません。

投稿2018/07/30 02:30

macaron_xxx

総合スコア3191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2018/07/30 03:14

>改めてSQLを発行する以外ありません。 そんなことは絶対ありません
macaron_xxx

2018/07/30 03:50

saziさん 前提条件「~でID=8を得たとき」、となっているので、 上記のSQLでID=8を取得するのは確定事項だと認識しています。 その上で一つ前のデータを取得する方法は改めてSQLを発行する以外に方法があるのでしょうか?
sazi

2018/07/30 04:02

その特定出来ているものを条件にすればいいだけです。 例えばその条件をサブクエリーとして構成すれば、問い合わせできます。 よくある事例ですし、データさえあれば如何様にでも取得できます。
macaron_xxx

2018/07/30 04:11

saziさん 「一つ前のデータ」=id昇順の一つ前という認識で皆さんいらっしゃいますが、私はそう判断していません。 なぜならば、前提のSELECT文はDESC指定です。 単純にSELECT * FROM 'sample'で取得したデータの「一つ前のデータ」だと私は判断しているので、順序が指定されていないものの一つ前のデータを取得することはできません。
sazi

2018/07/30 07:05

同じテーブルであっても自己結合すればいいだけなので、ひとつのSQLで取得できないものは無いのです。 当然これから登録するものというのだったりすると、工夫しなければいけませんけれども、それでも 一つのSQLで取得できないということは無いのです。
sazi

2018/07/30 07:09 編集

「順序が指定されていないものの一つ前のデータを取得することはできません。」というのが「不能」と言う意味で言われているのなら、話は別ですけど、「改めてSQLを発行する以外ありません。」と言われているので、「不能」という認識では無い訳ですよね?
sazi

2018/07/30 07:22

「不能」でないのなら、2つのSQLを一つにまとめることは「不能」ではありません。 気にしているのは、後学者が後から見て「2回発行するしかない」という回答を+評価が後押ししてしまって同じ認識に立ってしまわないかという事です。
macaron_xxx

2018/07/31 00:16

私は「不能」と認識しています。 SQLを2回発行しなければいけないということは申しておりません。 Where句で条件をしぼっている以上、他のデータがなく順序という概念がないため、「改めてSQLを発行する以外ない」=「順序指定できるようにSQLを発行する以外ない」ということを申しているまでです。
macaron_xxx

2018/07/31 00:18

質問に対する私の回答は >~でID=8を得たとき、一行のSQLでその一つ前のデータ(ID=3)も取得することは可能でしょうか? Where句が指定されている以上、順序がないため、取得「不能」です。 >それとももう一度SQLを書くしかないでしょうか? 改めてSQLを発行する以外ありません。 です。 その上で、みなさんの回答は「改めてSQLを発行する」方法です。
sazi

2018/07/31 01:02 編集

>~でID=8を得たとき、一行のSQLでその一つ前のデータ というのが条件です。 この条件は「不能」ではありません。 >みなさんの回答は「改めてSQLを発行する」方法です。 改めてというのは、「SQLを書き換える」という意味ですか。 てっきり、もう一度SQLを発行するという意味に捉えていました。 失礼しました。
guest

0

mysql なら カーソルの利用を検討してみてはいかがでしょう。

  • MySQL 操作をひと通りマスター!導入方法とCRUDサンプルコード集

https://it-engineer-lab.com/archives/1181

  • 「カーソル」を理解する

http://www.atmarkit.co.jp/ait/articles/1703/01/news193.html

  • MySQL ResultSetのStreamingとCursorの違い

https://yoskhdia.hatenablog.com/entry/2017/08/15/010858

投稿2018/07/30 21:49

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

もしかして、「現時点で最大の ID より小さい中で最大の ID を持つレコード」も欲しいのでしょうか?
だとすると

SELECT * FROM sample WHERE id <= (SELECT MAX(id) FROM sample) ORDER BY id DESC LIMIT 2;

これでよい?

投稿2018/07/30 04:52

編集2018/07/30 04:54
tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tacsheaven

2018/07/30 04:57

もっとも、id が unique ならば、そもそも max(id) なレコードは ordder by id desc した時点で必ず先頭にいるから、where で絞り込む必要すらありませんけど。(一つ前のレコードしか欲しくないならこういう対策が要りますが)
guest

0

書き方からするとMySQLでしょうか?
idにunique属性がついているのなら、id=8はソートやlimitはいらないですね

SQL

1SELECT (SELECT id FROM `sample` WHERE id < 8 ORDER BY id DESC LIMIT 1) as prev_id 2,(SELECT id FROM `sample` WHERE id = 8) as id 3

投稿2018/07/30 02:55

yambejp

総合スコア114769

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

order by id desc limit 1 してるなら id=8 じゃなく単に id<8 にすれば良いのでは?(今回の事例で3が欲しいならですがもし8と3が欲しいというなら id<=8 にして limit 2 にするというのでどうでしょうか)

投稿2018/07/30 02:31

編集2018/07/30 02:33
HiroshiWatanabe

総合スコア2160

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/07/30 02:33

limit 1 してる時点で、1件しかデータ取得していないっていう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問