sql >> データベース >  >> RDS >> Mysql

MySQL:左結合を実行して、結合テーブルから1行だけをプルできますか?

    私が理解したことを要約しましょう。各チケットとその最後の解決策を選択したいと思います。

    この種の質問には次のパターンを使用するのが好きです。これは、サブクエリパターンを回避するため、パフォーマンスが必要な場合にかなり適しているためです。欠点は、理解するのが少し難しいことです。

    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))
    


    1. MySQL、ORDER BY挿入順序、並べ替え列なし

    2. INSERT RETURNINGは正しい順序で物を返すことが保証されていますか?

    3. VS2019とMySQLEntityFrameworkのデータベース名が重複しています

    4. INNER JOIN ONvsWHERE句