MySQL - Търсене в няколко таблици едновременно

respec7_m3

Registered
Имам две таблици brands с колони id, name и таблица models с колони id, name, brands_id(което сочи към съответното id в таблица brands)

Направих html форма за търсене и идеята е, когато напиша в полето за търсене "Samsung" да ми изкара моделите на Samsung или пък на друг бранд.

Успях да направя мигновенното обновяване чрез jQuery, успявам и да търся, но само от една от таблиците.

Въпроса ми е как да търся и в двете таблици едновременно и при изписване името на даден бранд да се появяват моделите му като подсказка (видях, че трябва да използвам INNER JOIN, но не мога да оправя синтаксиса...).

Код:
$query = mysqli_query($dbconnect, "SELECT name, 'br' as type FROM brands WHERE name LIKE '%$searchq%' UNION SELECT name, 'mod' as type FROM models WHERE name LIKE '%$searchq%'") or die("Could not search!");

Това е заявката ми в момента, която търси в двете таблици, но не асоциира бранд с модел.
 
Маалко си се объркал с логиката.

Всъщност търсиш в една таблица, а не в две. Търсиш модели, а не брандове.

Затова трябва да започнеш оттук:

[sql]SELECT *
FROM models[/sql]

Това изважда всички модели. Следващата стъпка е към всеки модел да закачиш неговия бранд. Това "закачане" се изразява с "долепване" на ред от brands към всеки изваден ред от models.

Преди долепването (JOINът) на всеки ред имаш brand_id. Задачата ти е да кажеш на mysql да вземе правилния ред от brands, който съответства на извадения brand_id, и да ти го даде до същия ред, който току що си извадил от models.

Ето ти пример. С горната заявка ще изкараш това:

Код:
name brand_id
model_a1 1
model_a2 1
model_a3 2

Да предположим, че в brands имаш това:

Код:
id name
1 brand1
2 brand2
Сега ти трябва към резултата от горната заявка, към всеки ред от него, да залепиш съответния ред от brands.

Код:
name brand_id brand_name
model_a1 1 brand1
model_a2 1 brand1
model_a3 2 brand2
Разбираш ли? За всеки ред от първоначалната заявка сега имаме съответното име на бранда.

Последната стъпка е да филтрираш този резултат по brand_name според това, което е търсил потребителят. Ако е търсил brand1, то ще оставиш само тези два реда:

Код:
name brand_id brand_name
model_a1 1 brand1
model_a2 1 brand1

Как се прави всичко това? "Долепването", т.е. JOINът, има следният синтаксис:

[sql]LEFT JOIN brands
ON brands.id = models.brand_id[/sql]

В случая ни трябва LEFT JOIN. В интернет можеш да прочетеш по-подробно за разликата между LEFT/RIGHT/FULL OUTER/INNTER JOIN.
Указваме таблицата, от която ще взимаме другите резултати, а с ON даваме условието, при което един ред от едната таблица се маркира като съответстващ на ред от другата таблица. В нашия случай brand_id-то в models отговаря на id-полето в brands таблицата, затова условието ни е двете полета да имат еднакви стойности.

Накрая остана само да филтрираш по търсенето от юзера:

[sql]WHERE brand_name = %user_search%[/sql]

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

Горе