Cómo seleccionar entre múltiples tablas en MySQL
-
Usando GROUP BY
foodpara seleccionar de múltiples tablas -
Usando
JOINpara 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