1. ホーム
  2. mysql

[解決済み] SELECT * FROM multiple tables. MySQL

2023-05-07 20:24:46

質問

SELECT name, price, photo FROM drinks, drinks_photos WHERE drinks.id = drinks_id

は5行(5配列)を生成します。 photo は行内で唯一の一意なフィールドです。 name, price が繰り返される ( ここで fanta- name, price を3回繰り返します。 ) これらの重複を取り除くにはどうしたらよいでしょうか?

編集してください。 私は name, price と、すべての photo をそれぞれの飲み物のために使用します。

 id      name      price
  1.    fanta        5
  2.     dew         4


 id      photo                   drinks_id
  1.     ./images/fanta-1.jpg      1
  2.     ./images/fanta-2.jpg      1  
  3.     ./images/fanta-3.jpg      1 
  4.     ./images/dew-1.jpg        2
  5.     ./images/dew-2.jpg        2

どのように解決するのですか?

ここで行っているのは JOIN (と呼ばれるものです(複数のテーブルから選択しているので、暗黙のうちにやっているのですが)。つまり、WHERE句に何も条件を付けなかった場合、次のようになります。 すべての組み合わせ を持つことになります。条件によってのみ、ドリンクIDが一致する行に結合を制限することができます。

しかし、この特定のdrinks_idを持つX枚の写真がある場合、すべてのドリンクに対してX個の複数行が結果に含まれます。あなたのステートメントでは どの を制限していません。

飲み物ごとに1行だけ欲しい場合、特定のdrinks_idを持つ複数の行がある場合にどうしたいかをSQLに指示する必要があります。このためには、グループ化および 集約関数 . SQL にグループ化したい項目(例えば、drink_id がすべて等しいなど)を指定し、SELECT で、グループ化された各行について、どの個別の項目を取得するかを指定する必要があります。数値の場合、これは平均、最小、最大(いくつか例を挙げます)にすることができます。

あなたの場合、一行しか必要ないのであれば、飲み物の写真をクエリする意味が見当たりません。あなたはおそらく 写真の配列 という配列ができると思ったのでしょうが、SQL ではそれはできません。もしあなたが 任意の の写真だけが必要で、どれを取得するかは気にしないのであれば、drinks_id でグループ化してください (飲み物ごとに一行だけ取得するため)。

SELECT name, price, photo
FROM drinks, drinks_photos
WHERE drinks.id = drinks_id 
GROUP BY drinks_id

name     price   photo
fanta    5       ./images/fanta-1.jpg
dew      4       ./images/dew-1.jpg

また、MySQLでは GROUP_CONCAT を使用して、ファイル名を 1 つの文字列に連結することもできます。

SELECT name, price, GROUP_CONCAT(photo, ',')
FROM drinks, drinks_photos
WHERE drinks.id = drinks_id 
GROUP BY drinks_id

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

しかし、これは、もし , がある場合、これは危険です。なぜなら、ほとんどの場合、クライアント側でこれを再び分割したいからです。また、これは標準的な SQL 集約関数ではありません。