Извличане на данни от свързани таблици в PHP

Нека направим заявка, която ще извлече всички потребители заедно с техните градове. За това ще ни трябва командата LEFT JOIN:

Синтаксисът ѝ изглежда по следния начин:

sqlSELECT полета FROM име_на_таблица
  LEFT JOIN име_на_свързана_таблица ON условие_за_връзка 
WHERE условие_за_избор

Нека разгледаме отделните части от синтаксиса на тази команда.

Полета

Тъй като изборката е от няколко таблици, избирането на всички полета чрез * няма да работи. Следващата заявка ще избере полета само от основната таблица, но не и от свързаната:

sqlSELECT *

За да се изберат данни от всички таблици, трябва преди * да се посочи името на таблицата за избор:

sqlSELECT users.*, cities.*

Или може да се изброят нужните ни полета с посочване на името на таблицата пред тях:

sqlSELECT users.name, cities.name

Тези два начина имат проблем. Работата е там, че ако полетата в таблиците имат еднакви имена, то в масива на PHP ще възникне конфликт на имена и ще победи само едно поле, а второто няма да има.

За решаване на проблема трябва конфликтните имена да се преименуват чрез командата as:

sqlSELECT users.name, cities.name as city_name

Връзка

След командата ON трябва да посочим полета от двете таблици, по които се осъществява връзката. В нашия случай това ще бъде полето id от таблицата с градове и полето city_id от таблицата с потребители:

sqlON cities.id=users.city_id

Заявка

В крайна сметка заявката, която ще извлече потребителите заедно с техните градове ще изглежда по следния начин:

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

Практически задачи

Задание 1

Да приемем, че имате таблица с продукти и таблица с техните категории. Напишете заявка, която ще извлече имената на продуктите заедно с техните категории.