複数のテーブルのデータを結合する SELECT ステートメントを実行すると、例のように重複行が発生する可能性があります。提供されたシナリオでは:
SELECT name, price, photo FROM drinks, drinks_photos WHERE drinks.id = drinks_id
このクエリは、飲み物の 5 行を取得します。写真は唯一のユニークなフィールドです。ただし、名前と価格が繰り返されるため、「ファンタ」などの飲み物の行が重複します。
これらの重複を排除するには、グループ化と集計を利用する必要があります。機能。グループ化を使用すると、共通の値に基づいて行を結合できますが、集計関数を使用すると、グループごとに特定の値を抽出できます。
各ドリンクに 1 つの行が必要な場合は、関連付けられている写真の数に関係なく、ドリンク ID でグループ化できます:
SELECT name, price, photo FROM drinks, drinks_photos WHERE drinks.id = drinks_id GROUP BY drinks_id
このクエリは、 return:
name | price | photo |
---|---|---|
fanta | 5 | ./images/fanta-1.jpg |
dew | 4 | ./images/dew-1.jpg |
各ドリンクの写真の配列が必要な場合、MySQL は同じグループの値を連結する GROUP_CONCAT 関数を提供します。
SELECT name, price, GROUP_CONCAT(photo, ',') FROM drinks, drinks_photos WHERE drinks.id = drinks_id GROUP BY drinks_id
このクエリはyield:
name | price | photo |
---|---|---|
fanta | 5 | ./images/fanta-1.jpg,./images/fanta-2.jpg,./images/fanta-3.jpg |
dew | 4 | ./images/dew-1.jpg,./images/dew-2.jpg |
連結された値にカンマが含まれている場合、データベースのパフォーマンスの問題が発生したり、過度に大きな文字列が返されたりする可能性があるため、GROUP_CONCAT は注意して使用する必要があることに注意してください。
以上がSQL SELECT ステートメントで複数のテーブルを結合するときに行の重複を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。