SELECCIONAR de múltiplas tabelas no MySQL

Rayven Esplanada 30 janeiro 2023
  1. Utilizar GRUPO POR food para SELECCIONAR A PARTIR DE MÚLTIPLAS TABELAS
  2. Utilize JOIN para SELECCIONAR A partir de Múltiplas Tabelas no MySQL
  3. Utilize GROUP_CONCAT() e Manipule os Resultados no MySQL
SELECCIONAR de múltiplas tabelas no MySQL

Este tutorial mostra-lhe como consultar SELECT a partir de várias tabelas num único script com a utilização do MySQL.

Vamos demonstrar um cenário:

SELECT name, price, details, type,  FROM food, food_order  WHERE breakfast.id = 'breakfast_id'

Agora vamos imaginar exemplos de tabelas para cada entrada 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

Com base nas tabelas acima, podemos ver que Eggs tem 3 fotos, Ice cream também tem 3, enquanto Ramen tem 2. A saída que queremos produzir é uma tabela agregada de food e food_menu, mostrar todos os alimentos juntos e combiná-los com as fotos correspondentes no menu.

Se o consultarmos:

SELECT name, price, options, photo 
FROM food, food_menu 
WHERE food_id = '1'

O resultado seria o seguinte:

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

Os dados são duplicados porque existem múltiplas filas de food_menu relacionadas com food. Neste caso, existem 3 fotografias no menu food_menu que estão directamente ligadas a Ovos.

Não é possível uma simples consulta para juntar todas as inteiros de food_menu numa única linha, uma vez que todas elas são consideradas como entidades separadas que estão relacionadas com a tabela food.

Se quiser consultar food e food_menu ao mesmo tempo numa única linha, então aqui estão algumas opções para o fazer.

Utilizar GRUPO POR food para SELECCIONAR A PARTIR DE MÚLTIPLAS TABELAS

Esta abordagem utiliza o GROUP BY para agregar ambas as tabelas num único resultado. O inconveniente, no entanto, é que só terá a primeira instância do food_menu uma vez que estamos a forçar os resultados a serem únicos.

Abaixo está a consulta da tabela GROUP BY food:

SELECT name, price, options, photo
FROM food, food_menu
WHERE food_id = '1' 
GROUP BY food_id

A seguir, apresenta-se o seguinte resultado:

name price options photo
1 Eggs Scrambled, Sunny Side, Boiled eggs_sunnyside.jpg

Satisfizemos agora a condição, embora apenas uma fotografia seja devolvida, que é a primeira instância de food_menu encontrada pela consulta.

Utilize JOIN para SELECCIONAR A partir de Múltiplas Tabelas no MySQL

Esta abordagem faz uso do comando SQL JOIN ou RIGHT JOIN.

Em vez de termos 2 condições de FROM no guião, juntamos food_menu com base na sua chave externa food_id. Nós aliamos f a food e 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

Embora este método seja diferente do anterior, produz o mesmo resultado. Retorna a primeira instância de food_menu porque GROUP BY força a consulta a devolver filas únicas com base na sua condição.

name price options photo
1 Eggs Scrambled, Sunny Side, Boiled eggs_sunnyside.jpg

Utilize GROUP_CONCAT() e Manipule os Resultados no MySQL

Uma alternativa para o problema da solução anterior é utilizar GROUP_CONCAT() para colocar todos os resultados do food_menu numa única linha, portanto será possível colocar todos os seus registos numa única linha.

O que é GROUP_CONCAT()?

GROUP_CONCAT é uma função que combina os dados de várias filas para um único campo. É uma função especial GROUP BY que devolve uma string modificada se o grupo contiver pelo menos 1 valor não-nulo. Caso contrário, retorna NULL.

Modificamos a consulta acima para GROUP_CONCAT() coluna de fotos para concatenar os resultados numa única string.

SELECT name, price, options, GROUP_CONCAT(photo, ', ')
FROM food, food_menu
WHERE food_id = '1' 
GROUP BY food_id

Ao fazer isto, concatenamos a coluna de fotos de food_menu para que apenas uma linha por inteiro única de food seja gerada. O resultado seria o indicado:

name price options photo
1 Eggs Scrambled, Sunny Side, Boiled eggs_sunnyside.jpg,eggs_scrambled.jpg,eggs_boiled.jpg

Como se pode ver, concatenava as 3 colunas photo que estão relacionadas com os Ovos na tabela food.

Se removermos a condição GROUP BY e WHERE.

SELECT name, price, options, GROUP_CONCAT(photo, ', ')
FROM food, food_menu

O resultado seria o seguinte

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

Tenha cuidado usando GROUP_CONCAT(), se a sua coluna contém uma vírgula e o seu delimitador CONCAT é também uma vírgula, a análise da sua coluna corromperia os seus dados.

Portanto, antes de utilizar esta função, certifique-se de que o seu delimitador é um carácter inválido para a coluna com que está a manipulá-la.

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

Artigo relacionado - MySQL Table