Comment faire une sélection parmi plusieurs tables dans MySQL
-
Utiliser GROUP BY
food
pour SELECT à partir de plusieurs tables -
Utiliser
JOIN
pour SELECTIONNER à partir de plusieurs tables dans MySQL -
Utilisez
GROUP_CONCAT()
et manipulez les résultats 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.
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