SELECTEER * UIT meerdere tabellen. MijnSQL

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

levert 5 rijen (5 arrays) op, photois het enige unieke veld in een rij. name, pricewordt herhaald (hier,fanta-name, priceherhaal 3 keer.) Hoe kom ik van deze duplicaten af?

Bewerken:ik wil name, priceen alle photovoor elk drankje.

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

Antwoord 1, autoriteit 100%

Wat je hier doet heet een JOIN(hoewel je het impliciet doet omdat je uit meerdere tabellen selecteert). Dit betekent dat als je geen voorwaarden in je WHERE-component had gezet, je alle combinatiesvan die tabellen had. Alleen met je conditie beperk je je deelname tot die rijen waar de drank-ID overeenkomt.

Maar er zijn nog steeds X meerdere rijen in het resultaat voor elk drankje, als er X foto’s zijn met deze specifieke drinks_id. Uw verklaring beperkt niet welkefoto(‘s) u wilt hebben!

Als u slechts één rij per drankje wilt, moet u SQL vertellen wat u wilt doen als er meerdere rijen zijn met een bepaalde drinks_id. Hiervoor heb je groepering en een aggregaatfunctienodig . Je vertelt SQL welke items je wilt groeperen (bijvoorbeeld alle gelijke drinks_ids) en in de SELECT moet je aangeven welke van de verschillende items voor elke gegroepeerde resultaatrij moeten worden gebruikt. Voor getallen kan dit gemiddeld, minimum, maximum zijn (om er maar een paar te noemen).

In jouw geval zie ik de zin niet om de foto’s op drankjes te vragen als je maar één rij wilt. Je dacht waarschijnlijk dat je een reeks foto’sin je resultaat zou kunnen hebben voor elk drankje, maar SQL kan dit niet. Als je alleen elkefoto wilt en het maakt je niet uit welke je krijgt, groepeer dan gewoon op de drinks_id (om slechts één rij per drankje te krijgen):

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

In MySQL hebben we ook GROUP_CONCAT, als u wilt dat de bestandsnamen worden samengevoegd tot één enkele tekenreeks:

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

Dit kan echter gevaarlijk worden als u ,in de veldwaarden heeft, aangezien u dit hoogstwaarschijnlijk opnieuw aan de clientzijde wilt splitsen. Het is ook geen standaard SQL-aggregatiefunctie.


Antwoord 2, autoriteit 3%

Hier vindt u de dubbele waarden voor naam en prijs. En id’s zijn dubbel in de drinks_photos-tabel. Je kunt ze op geen enkele manier vermijden. Ook wat wil je precies de output?


Antwoord 3, autoriteit 2%

Om duplicaten te verwijderen, kunt u groeperen op drinks.id. Maar op die manier krijgt u slechts één foto voor elke drinks.id(welke foto u krijgt, hangt af van de interne implementatie van de database).

Hoewel het niet is gedocumenteerd, krijgt u in het geval van MySQL de foto met de laagste id(in mijn ervaring heb ik nog nooit ander gedrag gezien).

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

Other episodes