88

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

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

編集:私は飲み物ごと に欲しいですname, pricephoto

 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
4

3 に答える 3

120

ここで行うことは a と呼ばれますJOIN(ただし、複数のテーブルから選択するため、暗黙的に行います)。これは、WHERE 句に条件を何も指定しなかった場合、それらのテーブルのすべての組み合わせが存在することを意味します。あなたの条件でのみ、飲み物IDが一致する行に結合を制限します。

ただし、この特定の Drinks_id を持つ X 枚の写真がある場合、すべての飲み物の結果には依然として X 個の行があります。あなたの声明は、あなたがどの写真を撮りたいかを制限していません!

ドリンクごとに 1 行だけが必要な場合は、特定の Drinks_id を持つ複数の行がある場合に何をしたいかを SQL に伝える必要があります。このためには、グループ化と集計関数が必要です。どのエントリをグループ化するか (たとえば、すべての Drink_id が等しい) を SQL に指示し、SELECT で、グループ化された各結果行の個別のエントリのどれを取得する必要があるかを指示する必要があります。数値の場合、これは平均、最小、最大 (いくつか挙げると) のいずれかです。

あなたの場合、1行だけが必要な場合、飲み物の写真を照会する意味がわかりません。おそらく、各ドリンクの結果に写真の配列を含めることができると思ったでしょうが、SQL ではこれができません。写真だけが必要で、どれを取得するかを気にしない場合は、drinks_id でグループ化します (ドリンクごとに 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 には、ファイル名を 1 つの文字列に連結する場合に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 集計関数でもありません。

于 2012-10-15T06:01:44.043 に答える
3

ここでは、名前と価格の値が重複しています。そして、ids は、drinks_photos テーブルで重複しています。それらを回避する方法はありません。また、正確に何を出力したいですか?

于 2012-10-15T06:04:59.497 に答える
2

重複を取り除くために、 でグループ化できますdrinks.id。ただし、この方法では、それぞれに対して 1 つの写真しか取得できませんdrinks.id(どの写真を取得するかは、データベースの内部実装によって異なります)。

文書化されていませんが、MySQL の場合、最も低い写真が得られますid(私の経験では、他の動作を見たことがありません)。

SELECT name, price, photo 
FROM drinks, drinks_photos 
WHERE drinks.id = drinks_id
GROUP BY drinks.id
于 2012-10-15T06:03:41.823 に答える