こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

特定のデータの前後を取得したい

以下のようなテーブルがあり、
SELECT id , regist_date FROM table_name ORDER BY regist_date DESC;

↑このSQLで並べると↓以下になるとします。

id(int型)   regist_date(datetime型)
12      2017-03-30 08:05:03
95      2017-03-29 19:05:03
72      2017-03-28 12:05:03
15      2017-03-28 12:05:03
62      2017-03-27 15:05:03
94      2017-03-26 12:05:03

やりたい事はidが72というのが分かっており、
そのデータと前後のデータを取得したいです。
※日付の部分が完全に重複するデータが存在する場合もあります。
※idは重複しません。

↓このデータがとりたいです。
95      2017-03-29 19:05:03
72      2017-03-28 12:05:03
15      2017-03-28 12:05:03

SELECT * FROM table_name WHERE id = 72 ORDER BY regist_date DESC;
ここから先が分からなくなってしまいどなたかわかる方いらっしゃいますか?

投稿日時 - 2017-03-30 22:05:12

QNo.9311334

困ってます

質問者が選んだベストアンサー

1、ID=72のregist_dateより<=の最初を取得する。
2、ID=72のregist_dateより>=の最初を取得する。

もちろん、ID=72は除外。と、2度SQL文を実行したらいけるのでは?添付図は、この考えでID=95のレコードを取得しています。

投稿日時 - 2017-03-30 23:39:50

お礼

ありがとうございます。

投稿日時 - 2017-03-31 09:22:05

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

こんな感じでしょうか。

1. 連番変数設定
mysql> set @i=0;

2. 目的のカラム設定
mysql> set @t=72

3. 検索
mysql> select * from (select @i := @i+1 i, id,created_at from girls) a where i in (@t-1, @t, @t+1) ;
+------+-----+------------+
| i | id | regist_date)
+------+-----+------------+
| 249 | 95 | 2017-03-29 |
| 250 | 72 | 2017-03-28 |
| 251 | 15 | 2017-03-28 |
+------+-----+------------+

投稿日時 - 2017-03-31 11:56:11

お礼

うまく値が取得できませんでしたが参考にさせてもらいます。
ありがとうございます。

投稿日時 - 2017-03-31 15:18:43

ANo.2

【訂正】

UNION 句を使えば一度でOKでした。そういうことで前回答を訂正します。

SELECT TOP 1 Test.ID, Test.regist_date, Test_1.ID, Test_1.regist_date
FROM Test, Test AS Test_1
WHERE (((Test.ID)<>Test_1.ID) And ((Test.regist_date)>=Test_1.regist_date) And ((Test_1.ID)=72))

UNION

SELECT TOP 1 Test.ID, Test.regist_date, Test_1.ID, Test_1.regist_date
FROM Test, Test AS Test_1
WHERE (((Test.ID)=Test_1.ID) And ((Test.regist_date)>=Test_1.regist_date) And ((Test_1.ID)=72))

UNION

SELECT TOP 1 Test.ID, Test.regist_date, Test_1.ID, Test_1.regist_date
FROM Test, Test AS Test_1
WHERE (((Test.ID)<>Test_1.ID) And ((Test.regist_date)<=Test_1.regist_date) And ((Test_1.ID)=72));

MySQLの実行環境がありませんのでAccessでテストしています。確か、Top句の書き方は違ったとおもいますが、考え方は一緒です。なお、95,72,15の順になっていないのはUNION結合の順番がどうのこうのでテストしたからです。その辺りは修正されてください。

投稿日時 - 2017-03-31 00:04:18

お礼

ソースまで付けて試していただきありがとうございます。
考え方を理解してチャレンジしてみます!

投稿日時 - 2017-03-31 09:24:42

あなたにオススメの質問