2017-02-20 6 views
-1

問題は簡単に言えば、1番目のレコードは、レコードが最新の2番目のテーブルに結合したままにしておかなければなりません。したがって、私は関数MAX()を使用するアプローチを使用します。最大IDを持つ行を取得

現在、私は2つのテーブルを持っています。

試合

enter image description here

matches_payments

enter image description here |

は今、私はmatches_payments

望ましい結果

enter image description here

にMAX(id)を使用して最初の1に2つ目のテーブルに参加したいが、私は原因greatest-n-per-group問題に望ましい結果を得ていないのです。この機能を使用する場合、各グループ内のすべての行が省略されている列の同じ値を有していなければならないStackoverflow Question

クエリ

SELECT matches.id, mp.* 
FROM matches 
    LEFT JOIN (SELECT 
       MAX(id) AS id, 
       match_id 
       paymentStatus 
      FROM matches_payments 
      GROUP BY match_id) AS mp ON mp.id = matches.id; 

所望の結果が起因して生成されていませんGROUP BY部分から。サーバーはグループから任意の値を返すことが自由であるため、すべての値が同じでない限り、結果は不確定です。

のMySQLデベロッパーよりPS :私はテーブルが不十分に設計されている知っています。それは私の仕事ではなく、最後の開発者が行ったものです。

+0

あなたも 'マックス()'の試みで、あなたの 'sql'コードを投稿することができますか? – lois6b

+0

@downvoterは説明してくれませんか? –

+0

私は投票しませんでしたが、多分このような質問に必要なMCVEを省いたからでしょうか? – Barmar

答えて

1

2つの結合が必要です。 SQL Select only rows with Max Value on a Columnに示すように、matches_paymentsテーブルのセルフ・ジョインを使用して、それぞれmatch_idのIDが最も高い行を取得する必要があります。そして、次の2つのテーブル結合するmatchesからLEFT JOINこの:

SELECT m.*, mp.paymentStatus, mp.paymentAmount 
FROM matches AS m 
LEFT JOIN (
    SELECT mp1.* 
    FROM matches_payments AS mp1 
    JOIN (SELECT match_id, MAX(id) AS id 
      FROM matches_payments 
      GROUP BY match_id) AS mp2 
    ON mp1.match_id = mp2.match_id AND mp1.id = mp2.id 
) AS mp ON mp.match_id = m.id 
+0

説明して物事を明確にする時間をとってくれてありがとう:) –

関連する問題