66829


**下記で「aテーブル」の全レコードを取得したいです。**  
その際、「bテーブル」の指定カラムのmaxとminも一緒に取得するにはどうすれば良いですか？

**aテーブル。1**  
・idカラム(int)  
・titleカラム(varchar)

**bテーブル。多**  
・a_idカラム(int)  
・hoge_datetimeカラム(datetime)

**取得したい結果**  
・aテーブルの idカラム  
・aテーブルの titleカラム  
・bテーブルhoge_datetimeカラム の最新年月日時分秒  
・bテーブルhoge_datetimeカラム の最古年月日時分秒

* * *

やりたいこと(疑似コード)

[code]

    SELECT
      a.id,
      a.title,
      max(b.hoge_datetime),
      min(b.hoge_datetime)
    FROM a
    LEFT JOIN b ON a.id = b.a_id
    GROUP_BY a.id
    
[/code]


CC BY-SA 4.0
2020-05-19T07:05:00.517
66767
2020-05-21T01:04:55.723
7886
question
mysql
「1」対「多」で、「多」の指定カラムのmaxとminも一緒にSELECTしたい


ほぼほぼ質問のSQLで完成していると思います。  
一か所だけ`GROUP_BY`を`GROUP BY`にしてください

[code]

    SELECT
      a.id,
      a.title,
      max(b.hoge_datetime),
      min(b.hoge_datetime)
    FROM a
    LEFT JOIN b ON a.id = b.a_id
    GROUP BY a.id
    
    
    
    create table a(id integer primary key, title varchar(100));
    create table b(a_id integer, hoge_datetime datetime);
    
    insert into a SET id = 1, title="hoge";
    insert into a SET id = 2, title="hoge1";
    insert into a SET id = 3, title="hoge2";
    
    insert into b SET a_id = 1, hoge_datetime="2020-01-01 00:00:00";
    insert into b SET a_id = 2, hoge_datetime="2020-01-01 00:00:00";
    insert into b SET a_id = 2, hoge_datetime="2020-01-02 00:00:00";
    
[/code]

結果はこんな感じになります。

[code]

    1   hoge    2020-01-01 00:00:00 2020-01-01 00:00:00
    2   hoge1   2020-01-02 00:00:00 2020-01-01 00:00:00
    3   hoge2   NULL    NULL
    
[/code]

環境がわからないですが、MySQL5.7.5より前でONLY_FULL_GROUP_BYが有効だとエラーになるでしょうね。その場合はGROUP
BYにa.titleも含めちゃってください。

MySQL5.7.5以上であれば関係従属を見てくれるようになるので上の書き方で問題ないでしょう。

参考記事  
<https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html>  
<https://blog.kamipo.net/entry/2015/12/14/171838>


CC BY-SA 4.0
2020-05-21T01:04:55.723
66829
2020-05-21T01:04:55.723
22665
66767
answer