search
LoginSignup
1

More than 1 year has passed since last update.

posted at

[MySQL]1対多のテーブル構造でgorup byで取得する時に最新のレコードをJOINしたい

テーブル構造

order_settlementテーブル

id order_id settlement_id created_at
1 1 1 2020-12-01 12:22:54
2 1 2 2020-12-02 20:15:46
3 2 3 2020-12-02 23:22:51

orderテーブル

id order_number
1 A2012020001
2 A2012020002

settlementテーブル

id amount_jpy
1 200
2 300
3 500

1つの注文番号(order)に対して、複数の決済情報(order_settlement)が存在する状態。最新の決済情報をJOINして注文情報と一緒に取得したい場合。

取得したい形

order_number settlement_id amount_jpy created_at
A2012020001 2 300 2020-12-02 20:15:46
A2012020002 3 500 2020-12-02 23:22:51

SQL

where句でidを指定する際にサブクエリを使用し、同order_idを持つorder_settlementレコードの中で、idが一番大きい値が取得されるよう指定している。maxは指定列の最大値を求める関数。

SELECT
    o.order_number,
    os.settlement_id,
    s.amount_jpy,
    os.created_at
FROM
    order_settlement os
    INNER JOIN
        settlement s
    ON  s.id = os.settlement_id
    INNER JOIN
        order o
    ON  o.id = os.order_id
WHERE
    os.id IN(
        SELECT
            MAX(id)
        FROM
            order_settlement os2
        WHERE
            os2.order_id = o.id
    )
GROUP BY
    o.id
;

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1