• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:一番新しいdatetime型列があるレコードを取得)

一番新しいdatetime型列があるレコードを取得する方法

このQ&Aのポイント
  • AテーブルとBテーブルのカラム内容を取得する方法について詳しく説明します。
  • 条件1では、Aテーブルのidに対応するBテーブルのa_idが複数ある場合には、一番新しいcreated_atの値を持つレコードを取得します。
  • 条件2では、Aテーブルのidに対応するBテーブルのa_idが存在しない場合は、Aテーブルの内容を取得します。

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

  • ベストアンサー
  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.4

ANo1です。 <追加したい条件4> ・Bテーブル「created_at」カラムの値で、一番新しいレコードが複数あった場合、 Aテーブル「id」カラム(int型)が一番大きいレコードを1件返す ですけど、 ■前提 ・Aテーブルの1レコード(「id」カラム)に対して、0~複数のBテーブルレコード(「a_idカラム」)がある ・A.id = B.a_id からいうと、 一番新しいレコードが複数あった場合、 Aテーブル「id」カラム(int型)は同じ値になるはずですけど。 ★ひとつだけ2件重複取得されているレコードがありました。 というのが、まったく同じレコードが2件出てきたということなら、 当初の回答のselectの次にdistinctをいれればよい。 select distinct a.id,a.created_at as Acreated_at,a.area, b.a_id,b.created_at as Bcreated_at from Atable a left outer join Btable b on a.id = b.a_id and b.created_at = (select max(c.created_at) fron Btable c where c.a_id = b.a_id) ★この質問に挙げた仕様はサンプルレベルなので、実際には、Bテーブルのほかの項目もselectしている ならば、Bテーブルのほかの項目で判断しないと意味がないと思われます。 ・・・該当するほかの項目を挙げてもらえばSQLを直します。

re999
質問者

お礼

回答ありがとうございました。 大変参考になりましたー

その他の回答 (3)

  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.3

ごめんなさい。データベース久々に触ったので・・・ GROUP BY すると、ORDER BY 関係なくなるみたいです。 SELECT id ,t1.created_at AS acreated_at ,area ,t2.created_at AS bcreated_at FROM A AS t1 LEFT OUTER JOIN( # B が存在しないA テーブルの値がいらない場合は RIGHT OUTER JOIN で SELECT a_id , MAX(created_at) AS created_at FROM B GROUP BY a_id ) AS t2 ON t1.id = t2.a_id

re999
質問者

お礼

回答ありがとうございました。 大変参考になりましたー

  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.2

SELECT id ,t1.created_at AS acreated_at ,area ,t2.created_at AS bcreated_at FROM A AS t1 LEFT OUTER JOIN( SELECT a_id , created_at FROM B ORDER BY created_at DESC GROUP BY a_id ) AS t2 ON t1.id = t2.a_id でいけると思う。確認してないからちょっと自信なし

re999
質問者

補足

回答ありがとうございました。 試してみたのですが、 ORDER BY created_at DESC GROUP BY a_id の順番だと、自分の環境ではsyntaxエラーになるので、 GROUP BY a_id ORDER BY created_at DESC としたみたのですが、 そうすると、取得結果が昇順(?)になります。 「GROUP BY」使ったことがないので、どうすれば良いかもうひとつよく分からないのですが、 何かアドバイス等あればよろしくお願いします

  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.1

select a.id,a.created_at as Acreated_at,a.area, b.a_id,b.created_at as Bcreated_at from Atable a left outer join Btable b on a.id = b.a_id where b.created_at = (select max(c.created_at) fron Btable c where c.a_id = b.a_id) 別にwhereでなくてandでもいいけれど。

re999
質問者

補足

回答ありがとうございました。 おかげで希望通り動作させることが出来ました! 出来たのですが、当初想定していなケースがあったので、再度教えていただくことは可能でしょうか? <追加したい条件4> ・Bテーブル「created_at」カラムの値で、一番新しいレコードが複数あった場合、 Aテーブル「id」カラム(int型)が一番大きいレコードを1件返す <補足背景> ・SQL文(and利用)で取得したデータが欲しかったデータなのですが、ひとつだけ2件重複取得されているレコードがありました。確認したところ、Bテーブル「created_at」カラムに同じ値が2件あり、それがたまたま一番新しい日付だったため、発生したようでした。質問した時点ではそこまで頭が回らなかったのですが、select maxで対象が2件以上あったとき、さらに別の条件を追加するにはどうすればよいでしょうか?

関連するQ&A