SELEZIONA da più tabelle in MySQL
-
Usa GROUP BY
food
per SELEZIONARE da più tabelle -
Usa
JOIN
per SELEZIONARE da più tabelle in MySQL -
Usa
GROUP_CONCAT()
e manipola i risultati in MySQL
Questo tutorial mostra come interrogare SELECT
da più tabelle in un unico script con l’uso di MySQL.
Dimostriamo uno scenario:
SELECT name, price, details, type, FROM food, food_order WHERE breakfast.id = 'breakfast_id'
Ora immaginiamo tabelle di esempio per ciascuna voce FROM
:
food
food_id | name | price | options |
---|---|---|---|
1 | Eggs | 10.00 | Scrambled, Sunny Side, Boiled |
2 | Ice cream | 30.00 | Vanilla, Strawberry, Chocolate |
3 | Ramen | 12.00 | Regular, Spicy |
food_menu
order_id | photo | food_id |
---|---|---|
1 | eggs_scrambled.jpg | 1 |
2 | eggs_sunnyside.jpg | 1 |
3 | eggs_boiled.png | 1 |
4 | icecream_vanilla.jpg | 2 |
5 | icecream_strawberry.jpg | 2 |
6 | ice_cream_chocolate.jpg | 2 |
7 | ramen_regular.jpg | 3 |
8 | ramen_spicy.jpg | 3 |
Sulla base delle tabelle sopra, possiamo vedere che Eggs
ha 3 foto, Ice cream
anche 3, mentre Ramen
ne ha 2. L’output che vogliamo produrre è una tabella aggregata di food
e food_menu
, visualizzare tutti gli alimenti insieme e combinarli con le foto corrispondenti nel menu.
Se chiediamo questo:
SELECT name, price, options, photo
FROM food, food_menu
WHERE food_id = '1'
Il risultato sarebbe questo:
name | price | options | photo |
---|---|---|---|
1 | Eggs | Scrambled, Sunny Side, Boiled | eggs_sunnyside.jpg |
2 | Eggs | Scrambled, Sunny Side, Boiled | eggs_scrambled.jpg |
3 | Eggs | Scrambled, Sunny Side, Boiled | eggs_boiled.jpg |
I dati sono duplicati perché ci sono più righe di food_menu
relative a food
. In questo caso, ci sono 3 foto in food_menu
che sono collegate direttamente alle uova.
Non è possibile per una semplice query unire tutte le voci in food_menu
in una singola riga, poiché sono tutte considerate come entità separate legate alla tabella food
.
Se vuoi interrogare food
e food_menu
contemporaneamente in una singola riga, ecco alcune opzioni per farlo.
Usa GROUP BY food
per SELEZIONARE da più tabelle
Questo approccio utilizza GROUP BY
per aggregare entrambe le tabelle in un unico risultato. Lo svantaggio, tuttavia, è che otterrai solo la prima istanza di food_menu
poiché imponiamo che i risultati siano unici.
Di seguito è riportata la query per GROUP BY
la tabella food
:
SELECT name, price, options, photo
FROM food, food_menu
WHERE food_id = '1'
GROUP BY food_id
Verrebbe quindi visualizzato il seguente risultato:
name | price | options | photo |
---|---|---|---|
1 | Eggs | Scrambled, Sunny Side, Boiled | eggs_sunnyside.jpg |
Ora abbiamo soddisfatto la condizione, anche se viene restituita solo una foto, che è la prima istanza di food_menu
trovata dalla query.
Usa JOIN
per SELEZIONARE da più tabelle in MySQL
Questo approccio fa uso del comando JOIN
o RIGHT JOIN
di SQL.
Invece di avere 2 condizioni FROM nello script, ci JOIN food_menu
in base alla sua chiave esterna food_id
. Abbiamo alias f
per food
e fm
per food_menu
SELECT f.name, f.price, f.options, fm.food_menu
FROM food AS f
JOIN food_menu AS fm ON fm.food_id = f.food_id
WHERE food_id = '1'
GROUP BY f.food_id
Sebbene questo metodo sia diverso dal precedente, produce lo stesso risultato. Restituisce la prima istanza di food_menu
perché GROUP BY forza la query a restituire righe univoche in base alla sua condizione.
name | price | options | photo |
---|---|---|---|
1 | Eggs | Scrambled, Sunny Side, Boiled | eggs_sunnyside.jpg |
Usa GROUP_CONCAT()
e manipola i risultati in MySQL
Una soluzione alternativa al problema della soluzione precedente è usare GROUP_CONCAT()
per mettere tutti i risultati di food_menu
in una singola stringa, quindi sarà possibile mettere tutti i loro record in una singola riga.
Che cos’è GROUP_CONCAT()
?
GROUP_CONCAT
è una funzione che combina i dati di più righe in un singolo campo. È una funzione speciale GROUP BY
che restituisce una stringa modificata se il gruppo contiene almeno 1 valore non nullo. Altrimenti, restituisce NULL
.
Modifichiamo la query sopra alla colonna delle foto GROUP_CONCAT()
per concatenare i risultati in una stringa.
SELECT name, price, options, GROUP_CONCAT(photo, ', ')
FROM food, food_menu
WHERE food_id = '1'
GROUP BY food_id
In questo modo, concateniamo la colonna delle foto di food_menu
in modo che venga generata solo una riga per ogni voce unica di food
. Il risultato sarebbe come visualizzato:
name | price | options | photo |
---|---|---|---|
1 | Eggs | Scrambled, Sunny Side, Boiled | eggs_sunnyside.jpg,eggs_scrambled.jpg,eggs_boiled.jpg |
Come puoi vedere, ha concatenato le 3 colonne photo
relative alle uova nella tabella food
.
Se togliamo le condizioni GROUP BY
e WHERE
.
SELECT name, price, options, GROUP_CONCAT(photo, ', ')
FROM food, food_menu
Il risultato sarebbe simile a questo
name | price | options | photo |
---|---|---|---|
1 | Eggs | Scrambled, Sunny Side, Boiled | eggs_sunnyside.jpg,eggs_scrambled.jpg,eggs_boiled.jpg |
2 | Ice Cream | Vanilla, Strawberry, Chocolate | icecream_vanilla.jpg,icecream_strawberry.jpg,icecream_chocolate.jpg |
3 | Ramen | Regular, Spicy | ramen_regular.jpg,ramen_spicy.jpg |
Fai attenzione a usare GROUP_CONCAT()
, se la tua stringa contiene una virgola e anche il delimitatore CONCAT è una virgola, l’analisi della colonna corromperà i tuoi dati.
Quindi, prima di utilizzare questa funzione, assicurati che il delimitatore sia un carattere non valido per la colonna con cui lo stai manipolando.
Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.
LinkedIn