1. ホーム
  2. mysql

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

2022-03-05 17:08:28

質問

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 つの飲み物に対して 1 行しか必要ない場合、特定の drinks_id を持つ行が複数ある場合にどうするかを SQL に指示する必要があります。そのためには、グループ化および アグリゲート関数 . SQL にグループ化したい項目(例えば、drink_id がすべて等しい)を指定し、SELECT で、グループ化された各行について、どの個別の項目を取得するかを指定する必要があります。数値の場合は、平均値、最小値、最大値などの値を指定します。

あなたの場合、1行だけなら、飲み物の写真を問い合わせる意味はないと思うのですが。おそらく 写真の配列 というのがありますが、これは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の集計関数ではありません。