- ベストアンサー
MySQLでシーケンス番号の前後数を知る方法
- MySQLでGroup内のシーケンス番号の前後数を知る方法について説明します。
- ユーザーテーブルにおいて、特定のグループとシーケンス番号を持つユーザーの前後のシーケンス番号を取得する方法を解説します。
- サブクエリを使わずに、シーケンス番号の前後数を取得する方法について考えます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
条件が異なるから普通に、二回 SELECT * FROM user_table WHERE group_id = 1 AND sequence > 2 ORDER BY sequence LIMIT 1; SELECT * FROM user_table WHERE group_id = 1 AND sequence < 2 ORDER BY sequence DESC LIMIT 1; どーしても一回で済ませたいなら、 SELECT MAX(CASE sequence < 2 THEN sequence ELSE NULL END) AS prev MIN(CASE sequence > 2 THEN sequence ELSE NULL END) AS next FROM user_table WHERE group_id = 1; 又は SELECT * FROM user_table WHERE group_id = 1 AND sequence >= ( SELECT sequence FORM user_table WHERE group_id = 1 AND sequence < 2 ORDER BY sequence DESC LIMIT 1 ) AND sequence <> 2 LIMIT 2;
その他の回答 (2)
- yambejp
- ベストアンサー率51% (3827/7415)
例示より長くなってしまいちょっと微妙なんですが ちゃんとやるならこんな感じになりそうな気がします。 ちなみにSQLは効率を考えて2つにわけてあります select @rank:=( select count(*) from user_table as u2 where u1.group_id=u2.group_id and u1.id>u2.id ) as rank from user_table as u1 where group_id=1 and sequence=2 ; select ( select count(*) from user_table as u2 where u1.group_id=u2.group_id and u1.id>u2.id ) as rank ,`u1`.* from user_table as u1 where group_id=1 having rank between @rank -1 and @rank +1
お礼
ありがとうございます。 ご教示いただいたものより、私がすでに書いたものほうが効率的な気がします。。 select (select min(sequence) from user_table where group_id=1 and sequence>2) next,( select min(sequence) prev from user_table where group_id=1 and sequence<2) prev;
- nora1962
- ベストアンサー率60% (431/717)
例として提示されているのが「user_table」で、実際につくられたSQLのテーブルが「t_files 」、しかも「user_table」にはない「album_id」が出てきています。 「ページ」という言葉も出てますが、これがどういう意味なのかも分かりません。 ちょっと答えようがないです。
お礼
ご指摘いただきありがとうございます。 間違えておりました。 正しくは下記になります。 select (select min(sequence) from user_table where group_id=1 and sequence>2) next,( select min(sequence) prev from user_table where group_id=1 and sequence<2) prev;
補足
お礼の文も間違えてました。。。 select (select min(sequence) from user_table where group_id=1 and sequence>2) next,( select max(sequence) prev from user_table where group_id=1 and sequence<2) prev;
お礼
ありがとうございます。 ご教示いただいたものが少し間違っていたため下記のように修正し、実現しました。 SELECT MAX(CASE when sequence < 2 THEN sequence ELSE NULL END) AS prev, MIN(CASE when sequence > 2 THEN sequence ELSE NULL END) AS next FROM user_table WHERE group_id=1; 本当にありがとうございました!