• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:MySQLでシーケンス番号の前後数を知りたい)

MySQLでシーケンス番号の前後数を知る方法

このQ&Aのポイント
  • MySQLでGroup内のシーケンス番号の前後数を知る方法について説明します。
  • ユーザーテーブルにおいて、特定のグループとシーケンス番号を持つユーザーの前後のシーケンス番号を取得する方法を解説します。
  • サブクエリを使わずに、シーケンス番号の前後数を取得する方法について考えます。

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

  • ベストアンサー
  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.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;

szkshi
質問者

お礼

ありがとうございます。 ご教示いただいたものが少し間違っていたため下記のように修正し、実現しました。 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; 本当にありがとうございました!

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

例示より長くなってしまいちょっと微妙なんですが ちゃんとやるならこんな感じになりそうな気がします。 ちなみに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

szkshi
質問者

お礼

ありがとうございます。 ご教示いただいたものより、私がすでに書いたものほうが効率的な気がします。。 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)
回答No.1

例として提示されているのが「user_table」で、実際につくられたSQLのテーブルが「t_files 」、しかも「user_table」にはない「album_id」が出てきています。 「ページ」という言葉も出てますが、これがどういう意味なのかも分かりません。 ちょっと答えようがないです。

szkshi
質問者

お礼

ご指摘いただきありがとうございます。 間違えておりました。 正しくは下記になります。 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;

szkshi
質問者

補足

お礼の文も間違えてました。。。 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;

関連するQ&A