Cómo seleccionar entre múltiples tablas en MySQL
-
Usando GROUP BY
food
para seleccionar de múltiples tablas -
Usando
JOIN
para seleccionar entre múltiples tablas en MySQL -
Usa
GROUP_CONCAT()
y manipula los resultados en MySQL
Este tutorial muestra cómo consultar SELECT
desde múltiples tablas en un solo script con el uso de MySQL.
Vamos a demostrar un escenario:
SELECT name, price, details, type, FROM food, food_order WHERE breakfast.id = 'breakfast_id'
Ahora imaginemos tablas de muestra para cada entrada de 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 |
Basándonos en las tablas anteriores, podemos ver que Eggs
tiene 3 fotos, Ice cream
también tiene 3, mientras que Ramen
tiene 2. La salida que queremos producir es una tabla agregada de food
y food_menu
, mostrando toda la comida junta y combinándola con las fotos correspondientes en el menú.
Si consultamos esto:
SELECT name, price, options, photo
FROM food, food_menu
WHERE food_id = '1'
El resultado sería este:
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 |
Los datos están duplicados porque hay múltiples filas de food_menu
relacionadas con food
. En este caso, hay 3 fotos en food_menu
que están ligadas directamente a Eggs
.
No es posible para una simple consulta unir todas las entradas de food_menu
en una sola fila, ya que todas se consideran como entidades separadas que están relacionadas con la tabla food
.
Si quieres consultar food
y food_menu
al mismo tiempo en una sola fila, entonces aquí tienes algunas opciones para hacerlo.
Usando GROUP BY food
para seleccionar de múltiples tablas
Este enfoque utiliza GROUP BY
para agregar ambas tablas en un resultado. El inconveniente, sin embargo, es que sólo obtendrás la primera instancia de food_menu
ya que estamos forzando a que los resultados sean únicos.
Abajo está la consulta a la tabla GROUP BY
de food
:
SELECT name, price, options, photo
FROM food, food_menu
WHERE food_id = '1'
GROUP BY food_id
Entonces mostraría el siguiente resultado:
name | price | options | photo |
---|---|---|---|
1 | Eggs | Scrambled, Sunny Side, Boiled | eggs_sunnyside.jpg |
Ahora hemos cumplido la condición, aunque sólo se devuelve una foto, que es la primera instancia de food_menu
encontrada por la consulta.
Usando JOIN
para seleccionar entre múltiples tablas en MySQL
Este enfoque hace uso del comando JOIN
o RIGHT JOIN
de SQL.
En lugar de tener 2 condiciones FROM en el script, nos unimos a food_menu
basado en su clave foránea food_id
. Hemos puesto el alias f
a food
y fm
a 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
Aunque este método es diferente del anterior, produce el mismo resultado. Devuelve la primera instancia de food_menu
porque GROUP BY obliga a la consulta a devolver filas únicas basadas en su condición.
name | price | options | photo |
---|---|---|---|
1 | Eggs | Scrambled, Sunny Side, Boiled | eggs_sunnyside.jpg |
Usa GROUP_CONCAT()
y manipula los resultados en MySQL
Una solución provisional para el problema de la solución anterior es utilizar GROUP_CONCAT()
para poner todos los resultados de food_menu
en una sola cadena, por lo que será posible poner todos sus registros en una sola fila.
¿Qué es GROUP_CONCAT()
?
GROUP_CONCAT
es una función que combina los datos de múltiples filas en un solo campo. Es una función especial GROUP BY
que devuelve una cadena modificada si el grupo contiene al menos 1 valor no nulo. En caso contrario, devuelve NULL
.
Modificamos la consulta anterior a la columna GROUP_CONCAT()
photos para concatenar los resultados en una sola cadena.
SELECT name, price, options, GROUP_CONCAT(photo, ', ')
FROM food, food_menu
WHERE food_id = '1'
GROUP BY food_id
Haciendo esto, concatenamos la columna de fotos de food_menu
para que sólo se genere una fila por cada entrada única de food
. El resultado sería el que se muestra:
name | price | options | photo |
---|---|---|---|
1 | Eggs | Scrambled, Sunny Side, Boiled | eggs_sunnyside.jpg,eggs_scrambled.jpg,eggs_boiled.jpg |
Como puedes ver, concatenó las 3 columnas de photo
que están relacionadas con los huevos en la tabla de fod
.
Si eliminamos la condición GRUPO POR
y WHERE
.
SELECT name, price, options, GROUP_CONCAT(photo, ', ')
FROM food, food_menu
El resultado sería así
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 |
Ten cuidado al usar GROUP_CONCAT(), si tu cadena contiene una coma y tu delimitador CONCAT también es una coma, el análisis de tu columna corrompería tus datos.
Así que antes de usar esta función, asegúrate de que tu delimitador es un carácter inválido para la columna con la que lo estás manipulando.
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