- MySQL - Търсене в няколко таблици едновременно
WT форуми -> PHP MySQL ASP.NET -> MySQL - Търсене в няколко таблици едновременно
Създайте нова тема Напишете отговор 
Автор Съобщение
respec7_m3
Нов
Нов

Регистриран на: 30/06/2010 6:42 pm

Support: 0
Bonus: 0
Мнения: 169
Мнение 13/07/2018 2:50 pm     MySQL - Търсене в няколко таблици едновременно Отговорете с цитат


Имам две таблици 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!");


Това е заявката ми в момента, която търси в двете таблици, но не асоциира бранд с модел.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
anonimen
Активен
Активен

Регистриран на: 11/06/2012 8:07 pm

Support: 156
Bonus: 311
Мнения: 1441
Мнение 14/07/2018 12:35 pm      Отговорете с цитат


Маалко си се объркал с логиката.

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

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

SQL code:
SELECT *
FROM models


Това изважда всички модели. Следващата стъпка е към всеки модел да закачиш неговия бранд. Това "закачане" се изразява с "долепване" на ред от 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 code:
LEFT JOIN brands
ON brands.id = models.brand_id


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

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

SQL code:
WHERE brand_name = %user_search%


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

Регистриран на: 11/06/2012 8:07 pm

Support: 156
Bonus: 311
Мнения: 1441
Мнение 19/07/2018 12:04 pm      Отговорете с цитат


Някакъв напредък?
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Покажи мнения от преди:    
Създайте нова тема   Напишете отговор    web-tourist.net Форуми -> PHP MySQL ASP.NET Часовете са според зоната GMT + 2 Часа
Страница 1 от 1


 
Идете на:  
Не Можете да пускате нови теми
Не Можете да отговаряте на темите
Не Можете да променяте съобщенията си
Не Можете да изтривате съобщенията си
Не Можете да гласувате в анкети