Cómo seleccionar entre múltiples tablas en MySQL

Rayven Esplanada 30 enero 2023
  1. Usando GROUP BY food para seleccionar de múltiples tablas
  2. Usando JOIN para seleccionar entre múltiples tablas en MySQL
  3. Usa GROUP_CONCAT() y manipula los resultados en MySQL
Cómo seleccionar entre múltiples tablas 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.

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

Artículo relacionado - MySQL Table