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がマッチする行にあなたのジョインを制限します。
ただし、この特定のdrink_idを持つX枚の写真がある場合は、飲み物ごとに結果にX行が残っています。あなたの陳述は制限しませんwhichあなたが欲しい写真!
1ドリンクにつき1行だけが必要な場合は、特定のdrink_idを持つ行が複数ある場合にSQLに実行したいことを伝えなければなりません。これには、グループ化と 集約関数 が必要です。どのエントリをまとめてグループ化したいか(たとえば、すべて同じdrink_id)をSQLに指示し、SELECTでは、グループ化された各結果行に対して個別のエントリのどれを使用するかを指示する必要があります。数値の場合、これは平均、最小、最大(一部の名前を付けるため)になります。
あなたのケースでは、1行だけが欲しいのであれば、写真の飲み物を検索する意味がわかりません。あなたはたぶん飲み物ごとにあなたの結果に写真の配列を入れることができると思ったでしょう、しかしSQLはこれをすることができません。 any photoだけが欲しくて、どちらを取得しても構わない場合は、drink_idでグループ化してください(1ドリンクにつき1行のみ取得するため)。
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 も使用します。
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集計関数でもありません。
あなたはここで名前と価格のための重複した値を持つでしょう。そして、idはdrink_photosテーブルに重複しています。あなたがそれらを避けることができる方法はありません。
重複を取り除くために、drinks.id
でグループ化できます。しかしそのようにすれば、あなたはそれぞれのdrinks.id
に対して一つの写真しか手に入れることができません(あなたが手に入れる写真はデータベースの内部実装に依存します)。
それは文書化されていませんが、MySQLの場合、あなたは最も低いid
の写真を手に入れるでしょう(私の経験では私は他の振る舞いを見たことがありません)。
SELECT name, price, photo
FROM drinks, drinks_photos
WHERE drinks.id = drinks_id
GROUP BY drinks.id