Извличане на данни от свързани таблици в PHP
Нека направим заявка, която ще извлече
всички потребители заедно с техните градове. За това
ще ни трябва командата LEFT
JOIN:
Синтаксисът ѝ изглежда по следния начин:
SELECT полета FROM име_на_таблица
LEFT JOIN име_на_свързана_таблица ON условие_за_връзка
WHERE условие_за_избор
Нека разгледаме отделните части от синтаксиса на тази команда.
Полета
Тъй като изборката е от няколко таблици,
избирането на всички полета чрез * няма
да работи. Следващата заявка ще избере полета само
от основната таблица, но не и от свързаната:
SELECT *
За да се изберат данни от всички
таблици, трябва преди * да се посочи името
на таблицата за избор:
SELECT users.*, cities.*
Или може да се изброят нужните ни полета с посочване на името на таблицата пред тях:
SELECT users.name, cities.name
Тези два начина имат проблем. Работата е там, че ако полетата в таблиците имат еднакви имена, то в масива на PHP ще възникне конфликт на имена и ще победи само едно поле, а второто няма да има.
За решаване на проблема трябва конфликтните имена
да се преименуват чрез командата as:
SELECT users.name, cities.name as city_name
Връзка
След командата ON трябва да посочим
полета от двете таблици, по които се осъществява
връзката. В нашия случай това ще бъде полето id
от таблицата с градове и полето city_id
от таблицата с потребители:
ON cities.id=users.city_id
Заявка
В крайна сметка заявката, която ще извлече потребителите заедно с техните градове ще изглежда по следния начин:
SELECT
users.name, cities.name as city_name
FROM
users
LEFT JOIN cities ON cities.id=users.city_id
Практически задачи
Да приемем, че имате таблица с продукти и таблица с техните категории. Напишете заявка, която ще извлече имената на продуктите заедно с техните категории.