sql >> Database >  >> RDS >> Mysql

KIES * UIT meerdere tabellen. MySQL

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-clausule had gezet, je alle combinaties had van die tafels. 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 welke foto('s) die je wilt hebben!

Als je maar één rij per drankje wilt, moet je SQL vertellen wat je wilt doen als er meerdere rijen zijn met een bepaalde drinks_id. Hiervoor heb je groepering nodig en een aggregatiefunctie . 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's zou kunnen hebben in uw resultaat voor elk drankje, maar SQL kan dit niet doen. Als je alleen elke . wilt foto en het maakt je niet uit welke je krijgt, groepeer 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 , . heeft binnen de veldwaarden, aangezien u dit hoogstwaarschijnlijk opnieuw aan de clientzijde wilt splitsen. Het is ook geen standaard SQL-aggregatiefunctie.



  1. Oracle:hoe UPSERT (bijwerken of invoegen in een tabel?)

  2. Tijdzoneconversie in SQL-query

  3. Tupels gebruiken in de SQL IN-clausule

  4. Intel SSD, nu van de sh..err, beschaamde lijst