Obtenção de dados de tabelas relacionadas em PHP

Vamos fazer uma consulta que irá buscar todos os usuários junto com suas cidades. Para isso precisaremos do comando LEFT JOIN:

Sua sintaxe é a seguinte:

sqlSELECT campos FROM nome_da_tabela
  LEFT JOIN nome_da_tabela_relacionada ON condição_de_ligação 
WHERE condição_de_seleção

Vamos analisar as partes individuais da sintaxe deste comando.

Campos

Como a seleção é feita a partir de várias tabelas, selecionar todos os campos através de * não funcionará. A seguinte consulta selecionará campos apenas da tabela principal, mas não da tabela relacionada:

sqlSELECT *

Para que os dados sejam selecionados de todas as tabelas, é necessário especificar o nome da tabela antes de * para a seleção:

sqlSELECT users.*, cities.*

Ou pode-se listar os campos que precisamos especificando o nome da tabela antes deles:

sqlSELECT users.name, cities.name

Estas duas formas têm um problema. O fato é que, se os campos nas tabelas tiverem os mesmos nomes, ocorrerá um conflito de nomes no array PHP e apenas um campo prevalecerá, e o segundo não estará presente.

Para resolver o problema, é necessário renomear os nomes em conflito usando o comando as:

sqlSELECT users.name, cities.name as city_name

Ligação

Após o comando ON, devemos especificar os campos das duas tabelas pelos quais a ligação é feita. No nosso caso, será o campo id da tabela de cidades e o campo city_id da tabela de usuários:

sqlON cities.id=users.city_id

Consulta

No final, a consulta que irá buscar os usuários junto com suas cidades ficará da seguinte forma:

sqlSELECT 
  users.name, cities.name as city_name
FROM 
  users
LEFT JOIN cities ON cities.id=users.city_id

Tarefas práticas

Задание 1

Suponha que você tenha uma tabela de produtos e uma tabela de suas categorias. Escreva uma consulta que busque os nomes dos produtos junto com suas categorias.