Comment faire une sélection parmi plusieurs tables dans MySQL

Rayven Esplanada 30 janvier 2023
  1. Utiliser GROUP BY food pour SELECT à partir de plusieurs tables
  2. Utiliser JOIN pour SELECTIONNER à partir de plusieurs tables dans MySQL
  3. Utilisez GROUP_CONCAT() et manipulez les résultats dans MySQL
Comment faire une sélection parmi plusieurs tables dans MySQL

Ce tutoriel vous montre comment interroger SELECT à partir de plusieurs tables dans un seul script avec l’utilisation de MySQL.

Faisons la démonstration d’un scénario :

SELECT name, price, details, type,  FROM food, food_order  WHERE breakfast.id = 'breakfast_id'

Imaginons maintenant des exemples de tables pour chaque entrée 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

En nous basant sur les tables ci-dessus, nous pouvons voir que Eggs a 3 photos, Ice cream en a aussi 3, tandis que Ramen en a 2. La sortie que nous voulons produire est une table agrégée de food et food_menu, affichant tous les aliments ensemble et les combinant avec les photos correspondantes dans le menu.

Si nous interrogeons cela :

SELECT name, price, options, photo 
FROM food, food_menu 
WHERE food_id = '1'

Le résultat serait le suivant :

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

Les données sont dupliquées parce qu’il y a plusieurs lignes de food_menu liées à food. Dans ce cas, il y a 3 photos dans food_menu qui sont directement liées aux oeufs.

Il n’est pas possible pour une simple requête de joindre toutes les entrées de food_menu en une seule ligne, car elles sont toutes considérées comme des entités séparées qui sont liées à la table food.

Si vous voulez interroger food et food_menu en même temps sur une seule ligne, alors voici quelques options pour faire cela.

Utiliser GROUP BY food pour SELECT à partir de plusieurs tables

Cette approche utilise GROUP BY pour agréger les deux tableaux en un seul résultat. L’inconvénient, cependant, est que vous n’obtiendrez que la première instance de food_menu puisque nous forçons les résultats à être uniques.

Ci-dessous se trouve la requête à la table GROUP BY food :

SELECT name, price, options, photo
FROM food, food_menu
WHERE food_id = '1' 
GROUP BY food_id

Elle affichera alors le résultat suivant :

name price options photo
1 Eggs Scrambled, Sunny Side, Boiled eggs_sunnyside.jpg

Nous avons maintenant satisfait la condition, bien qu’une seule photo soit retournée, qui est la première instance de food_menu trouvée par la requête.

Utiliser JOIN pour SELECTIONNER à partir de plusieurs tables dans MySQL

Cette approche utilise la commande SQL JOIN ou RIGHT JOIN.

Au lieu d’avoir 2 conditions FROM dans le script, nous JOINNONS le food_menu sur la base de sa clé étrangère food_id. Nous avons aliasé f pour food et fm pour 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

Bien que cette méthode soit différente de la précédente, elle donne le même résultat. Elle retourne la première instance de food_menu parce que GROUP BY force la requête à retourner des lignes uniques en fonction de sa condition.

name price options photo
1 Eggs Scrambled, Sunny Side, Boiled eggs_sunnyside.jpg

Utilisez GROUP_CONCAT() et manipulez les résultats dans MySQL

Un contournement du problème de la solution précédente est d’utiliser GROUP_CONCAT() pour mettre tous les résultats de food_menu dans une seule chaîne, il sera donc possible de mettre tous leurs enregistrements dans une seule ligne.

Qu’est-ce que GROUP_CONCAT() ?

GROUP_CONCAT est une fonction qui combine les données de plusieurs lignes en un seul champ. C’est une fonction spéciale GROUP BY qui retourne une chaîne modifiée si le groupe contient au moins 1 valeur non nulle. Sinon, elle retourne NULL.

Nous modifions la requête ci-dessus en GROUP_CONCAT() colonne photos pour concaténer les résultats en une seule chaîne.

SELECT name, price, options, GROUP_CONCAT(photo, ', ')
FROM food, food_menu
WHERE food_id = '1' 
GROUP BY food_id

En faisant cela, nous concaténons la colonne photos de food_menu de sorte qu’une seule ligne par entrée unique de food sera générée. Le résultat sera tel qu’il est affiché :

name price options photo
1 Eggs Scrambled, Sunny Side, Boiled eggs_sunnyside.jpg,eggs_scrambled.jpg,eggs_boiled.jpg

Comme vous pouvez le voir, il a concaténé les 3 colonnes photo qui sont liées aux oeufs dans la table food.

Si nous supprimons la condition GROUP BY et WHERE.

SELECT name, price, options, GROUP_CONCAT(photo, ', ')
FROM food, food_menu

Le résultat ressemblerait à ceci

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

Faites attention en utilisant GROUP_CONCAT(), si votre chaîne contient une virgule et que votre délimiteur CONCAT est également une virgule, l’analyse de votre colonne corromprait vos données.

Donc, avant d’utiliser cette fonction, assurez-vous que votre délimiteur est un caractère non valide pour la colonne avec laquelle vous le manipulez.

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

Article connexe - MySQL Table