How to SELECT From Multiple Tables in MySQL
-
Use GROUP BY
foodto SELECT From Multiple Tables -
Use
JOINto SELECT From Multiple Tables in MySQL -
Use
GROUP_CONCAT()and Manipulate the Results in MySQL
This tutorial shows you how to query SELECT from multiple tables in a single script with the use of MySQL.
Let’s demonstrate one scenario:
SELECT name, price, details, type, FROM food, food_order WHERE breakfast.id = 'breakfast_id'
Now let’s imagine sample tables for each FROM entry:
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 |
Basing on the tables above, we can see that Eggs have 3 photos, Ice cream also has 3, while Ramen has 2. The output we want to produce is an aggregated table of food and food_menu, display all the food together and combining them with the corresponding photos in the menu.
If we query this:
SELECT name, price, options, photo
FROM food, food_menu
WHERE food_id = '1'
The result would be this:
| 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 |
The data is duplicated because there are multiple rows of food_menu related to food. In this case, there are 3 photos in food_menu that are tied directly to Eggs.
It is not possible for a simple query to join all the entries in food_menu in one single row, since they are all considered as separate entities that are related to table food.
If you want to query food and food_menu at the same time in a single row, then here are a few options to do that.
Use GROUP BY food to SELECT From Multiple Tables
This approach uses GROUP BY to aggregate both tables in one result. The drawback, however, is you will only get the first instance of food_menu since we’re forcing the results to be unique.
Below is the query to GROUP BY food table:
SELECT name, price, options, photo
FROM food, food_menu
WHERE food_id = '1'
GROUP BY food_id
It would then display the following result:
| name | price | options | photo |
|---|---|---|---|
| 1 | Eggs | Scrambled, Sunny Side, Boiled | eggs_sunnyside.jpg |
We now have satisfied the condition, although only one photo is returned, which is the first instance of food_menu found by the query.
Use JOIN to SELECT From Multiple Tables in MySQL
This approach makes use of SQL’s JOIN or RIGHT JOIN command.
Instead of having 2 FROM conditions in the script, we JOIN food_menu based on its food_id foreign key. We aliased f for food and fm for 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
Although this method is different from the previous one, it produces the same result. It returns the first instance of food_menu because GROUP BY forces the query to return unique rows based on its condition.
| name | price | options | photo |
|---|---|---|---|
| 1 | Eggs | Scrambled, Sunny Side, Boiled | eggs_sunnyside.jpg |
Use GROUP_CONCAT() and Manipulate the Results in MySQL
A workaround for the problem of the previous solution is to use GROUP_CONCAT() to put all the results of food_menu in one single string, therefore it will be possible to put all their records in a single row.
What Is GROUP_CONCAT()?
GROUP_CONCAT is a function that combines the data from multiple rows to a single field. It’s a GROUP BY special function that returns a modified string if the group contains at least 1 non-null value. Otherwise, it returns NULL.
We modify the query above to GROUP_CONCAT() photos column to concatenate the results into one string.
SELECT name, price, options, GROUP_CONCAT(photo, ', ')
FROM food, food_menu
WHERE food_id = '1'
GROUP BY food_id
By doing this, we concatenate the photo column of food_menu so that only one row per unique entry of food will be generated. The result would be as displayed:
| name | price | options | photo |
|---|---|---|---|
| 1 | Eggs | Scrambled, Sunny Side, Boiled | eggs_sunnyside.jpg,eggs_scrambled.jpg,eggs_boiled.jpg |
As you can see, it concatenated the 3 photo columns that are related to Eggs in the food table.
If we remove the GROUP BY and WHERE condition.
SELECT name, price, options, GROUP_CONCAT(photo, ', ')
FROM food, food_menu
The result would look like this
| 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 |
Do be careful using GROUP_CONCAT(), if your string contains a comma and your CONCAT delimiter is a comma as well, parsing your column would corrupt your data.
So before you use this function, make sure that your delimiter is an invalid character for the column that you’re manipulating it with.
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