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

MySQLのテーブルから単一の行を結合します

    これは、StackOverflowで頻繁に発生するグループあたり最大の問題です。

    これが私のいつもの答えです:

    select
      p.name        player,
      s.date        first_score,
      s.points      points
    
    from  players p
    
    join  scores  s
      on  s.player_id = p.id
    
    left outer join scores  s2
      on  s2.player_id = p.id
          and s2.date < s.date
    
    where
      s2.player_id is null
    
    ;
    

    言い換えると、スコアsが与えられた場合、同じプレーヤーのスコアs2を見つけようとしますが、日付は早くなります。以前のスコアが見つからない場合は、sが最も早いスコアです。

    同点についてのコメントを再確認してください。同点の場合にどちらを使用するかについてのポリシーが必要です。 1つの可能性は、自動インクリメントの主キーを使用する場合、値が最も小さいものが前のキーであるということです。以下の外部結合の追加用語を参照してください:

    select
      p.name        player,
      s.date        first_score,
      s.points      points
    
    from  players p
    
    join  scores  s
      on  s.player_id = p.id
    
    left outer join scores  s2
      on  s2.player_id = p.id
          and (s2.date < s.date or s2.date = s.date and s2.id < s.id)
    
    where
      s2.player_id is null
    
    ;
    

    基本的に、少なくとも特定のプレーヤーにとって一意であることが保証されている列に到達するまで、タイブレーカー用語を追加する必要があります。多くの場合、テーブルの主キーが最善の解決策ですが、別の列が適している場合もあります。

    @OMG Poniesと共有したコメントに関して、このタイプのクエリは適切なインデックスから大きな恩恵を受けることを忘れないでください。



    1. Laravel-PDOプリペアドステートメント-他のバッファリングされていないクエリがアクティブな間はクエリを実行できません

    2. 新しいインデックス列をキーに含める必要がありますか、それとも含める必要がありますか?

    3. MySQLは他のDBMSと比較して大幅に多くのリソースを消費しますか?

    4. MySQLのルートパスワードをリセットする