人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

MySQLで、該当のレコードの
1件前の情報と、1件後の情報を
同時に取得できるようなSQL文は可能でしょうか?

●質問者: hopefully
●カテゴリ:就職・転職 コンピュータ
✍キーワード:MySQL SQL レコード
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● pahoo
●23ポイント

結論から書くと、できません。


一般的にSQL系DBでは、レコードの並び順は不定です。

たとえば、新しいレコードをinsertした場合、それが最終レコードに追加されるか、レコードの途中に挿入されるかは、RDBMSによってまちまちです。MySQLでは、deleteでレコード削除が行われており、DB再構築が行われていないと、途中に挿入されるようです。

したがって、あるカラムに対する並び順を指定してやらない限り、「1件前」「1件後」という順序指定はできません。

◎質問者からの返答

並び順ってどういう順序にすればいいんですか?


2 ● guja
●23ポイント

例えば値が1ずつ増えるユニークなid列(主キー)がある場合であれば、可能といえば可能です。

例えば、tableにid,nameというフィールドがあって、

1 a

2 b

3 c

というようなデータ形式であれば、次のようなSQLで取得できます。


SELECT * FROM table AS target_table

LEFT JOIN table AS before_table ON before_table.id = target_table.id - 1

LEFT JOIN table AS after_table ON after_table.id = target_table.id + 1

WHERE target_table.id = 2;


ただしこの場合は1,2,3,と必ず1ずつ値が増えるレコードが存在している、という前提ですので、かなり制限は大きいです。

◎質問者からの返答

試してみましたが、結果は0件です。

うーーん、なんででしょうかね・・・


3 ● b-wind
●22ポイント

無理やりやろうとすれば、出来なくも無い。

元テーブルが、以下のとおりだとすると

CREATE TABLE data (
 data_id int primary key,
 data_text text
 sort_column int not null
);

で、目標のデータが、data_id = 10 だとする。


REATE TEMPORARY TABLE sort_data (
 id int primary key AUTO_INCREMENT,
 data_id int NOT NULL,
 data_text text
) SELECT NULL,data_id,data_text FROM data ORDER BY sort_columns;

としておいてから、

SELECT data_id, data_text
 FROM sort_data
 WHERE id BETWEEN
 ( SELECT id - 1 FROM sort_data a WHERE data_id = 10 )
 AND
 ( SELECT id + 1 FROM sort_data a WHERE data_id = 10 )

とか。


ただ、見てのとおりわかりやすくもないし、効率もよくない。

アクセスするアプリケーション側で処理するほうが楽。

◎質問者からの返答

了解です。やはり、foreachなどで

処理するのが無難ですかね。


4 ● ken33jp
●22ポイント

http://q.hatena.ne.jp/pahoo/

できないといってるので、できないと思いますよ。


http://q.hatena.ne.jp/1192783057

こんなのでよかったら、実現可能です。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ