SELEZIONA da più tabelle in MySQL

Rayven Esplanada 30 gennaio 2023
  1. Usa GROUP BY food per SELEZIONARE da più tabelle
  2. Usa JOIN per SELEZIONARE da più tabelle in MySQL
  3. Usa GROUP_CONCAT() e manipola i risultati in MySQL
SELEZIONA da più tabelle 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.

Rayven Esplanada avatar Rayven Esplanada avatar

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

Articolo correlato - MySQL Table