SELECCIONAR de múltiplas tabelas no MySQL
-
Utilizar GRUPO POR
food
para SELECCIONAR A PARTIR DE MÚLTIPLAS TABELAS -
Utilize
JOIN
para SELECCIONAR A partir de Múltiplas Tabelas no MySQL -
Utilize
GROUP_CONCAT()
e Manipule os Resultados 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.
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