私が理解したことを要約しましょう。各チケットとその最後の解決策を選択したいと思います。
この種の質問には次のパターンを使用するのが好きです。これは、サブクエリパターンを回避するため、パフォーマンスが必要な場合にかなり適しているためです。欠点は、理解するのが少し難しいことです。
SELECT
t.*,
s1.*
FROM tickets t
INNER JOIN solutions s1 ON t.id = s1.ticket_id
LEFT JOIN solutions s2 ON s1.ticket_id = s2.ticket_id AND s2.id > s1.id
WHERE s2.id IS NULL;
理解を深めるために、パターンの中心だけを書きました。
キーは次のとおりです。
-
solutions
の左の結合s1.ticket_id = s2.ticket_id
を含むテーブル 条件:GROUP BY ticket_id
をエミュレートします 。 -
条件
s2.id > s1.id
:これは「最後のソリューションのみが必要」のSQLであり、MAX()
をエミュレートします。 。あなたのモデルでは、the last
with the greatest id
を意味します ただし、ここでは日付の条件を使用できます。s2.id < s1.id
に注意してください 最初の解決策が得られます。 -
WHERE句
s2.id IS NULL
:最も奇妙なものですが、絶対に必要です...必要なレコードのみを保持します。
試してみて、私に知らせてください:)
編集1: 2番目のポイントの仮定が問題を単純化しすぎていることに気づきました。それはそれをさらに面白くします:p私はこのパターンがあなたのdate, id
でどのように機能するかを見ようとしています 注文。
編集2: わかりました、少しひねりを加えてうまく機能します。 LEFTJOINの条件は次のようになります。
LEFT JOIN solutions s2 ON s1.ticket_id = s2.ticket_id
AND (s2.date > s1.date OR (s2.date = s1.date AND s2.id > s1.id))