sql >> Databasteknik >  >> RDS >> Mysql

VÄLJ * FRÅN flera tabeller. MySQL

Det du gör här kallas en JOIN (även om du gör det implicit eftersom du väljer från flera tabeller). Det betyder att om du inte satte några villkor i din WHERE-klausul hade du alla kombinationer av dessa tabeller. Endast med ditt tillstånd begränsar du din anslutning till de rader där dryckes-id matchar.

Men det finns fortfarande X flera rader i resultatet för varje drink, om det finns X foton med just detta drinks_id. Ditt uttalande begränsar inte vilket foto(n) du vill ha!

Om du bara vill ha en rad per drink måste du tala om för SQL vad du vill göra om det finns flera rader med ett visst drinks_id. För detta behöver du gruppering och en aggregerad funktion . Du talar om för SQL vilka poster du vill gruppera tillsammans (till exempel alla lika drinks_ids) och i SELECT måste du tala om vilka av de distinkta posterna för varje grupperad resultatrad som ska tas. För siffror kan detta vara genomsnitt, minimum, maximum (för att nämna några).

I ditt fall kan jag inte se meningen med att fråga bilderna efter drinkar om du bara vill ha en rad. Du trodde förmodligen att du kunde ha en uppsättning foton i ditt resultat för varje drink, men SQL kan inte göra detta. Om du bara vill ha någon foto och du bryr dig inte om vilken du får, bara gruppera efter drinks_id (för att bara få en rad per drink):

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

I MySQL har vi även GROUP_CONCAT , om du vill att filnamnen ska sammanfogas till en enda sträng:

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

Detta kan dock bli farligt om du har , inom fältvärdena, eftersom du troligen vill dela upp detta igen på klientsidan. Det är inte heller en standard SQL-aggregatfunktion.



  1. Hämta värden från första och sista raden per grupp

  2. MySQL Data - Bästa sättet att implementera personsökning?

  3. SQL Server Triggers – Del 2 DDL &LOGON Triggers

  4. Hur ansluter jag till MySQL Database?