powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как правильно сделать поиск по 5 таблицам.
16 сообщений из 16, страница 1 из 1
Как правильно сделать поиск по 5 таблицам.
    #38455632
igramnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Помогите правильно сделать поиск.

Есть 5 таблиц.

1. subsections - таблица категорий. Структура ID, NAME
2. brands - таблица брендов (например, Apple, Nokia). Структура: ID, NAME, ID_SUBSECTIONS (это ID категории)
3. goods - таблица товаров (например, Apple iPhone 5). Структура: ID, NAME, BRAND_ID (это ID бренда), subsection_id (это ID категории)
4. brands_alternative - таблица с альтернативными названиями бренда. Например: Aple, Эппл. Т.е. данная таблица содержит варианты названий реального бренда. Стуктура: ID, NAME, BRAND_ID.
5. subsections_alternative - таблица с альтернативными названиями категории. Например, для категории "Сотовые телефоны" можно привязать названия "Мобильный телефоны", "Смартфоны". Т.е. данная таблица содержит варианты названий реальной категории. Стуктура: ID, NAME, SUBSECTION_ID.

Допустим человек ищет фразу "телефон Aple iphone 5s"

Нужно вывести результаты в следующем порядке.

1. Если слово из искомой фразы встретилось в названии категории (subsections) или в названии альтернативной категории (subsections_alternative), то сначала вывести список категорий.
2. Если слово из искомой фразы содержится в названии товара (goods) и названии бренда (brands) или альтернативы бренда (brands_alternative), то вывести список таких товаров.
3. Если слово из искомой фразы содержится просто в названии товара (goods), то вывести товары.
4. Если слово из искомой фразы содержится просто в названии бренда (brands) или в его альтернативном названии (brands_alternative), то вывести товары с этим брендом.

Важно, чтобы приоритет вывода был согласно списку 4х пунктов Выше, т.е. самый приоритетный вариант - 1, затем 2, потом 3 и 4.

Нужно также выводить товары из пунктов 2-4 так, чтобы они не повторялись. Т.е. если товар нашелся по пункту 2, то понятно, что он найдется и в пункте 3 или 4, но повторно в результат поиска его вносить не надо.

Готов оплатить работу, если она окажется сложной. Просто очень нужна помощь специалиста.
...
Рейтинг: 0 / 0
Как правильно сделать поиск по 5 таблицам.
    #38455691
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igramnet,

Видимо, раз "слово встретилось", то нужен полнотекстовый поиск, т.е. полнотекстовый индекс.
А далее уже — логика поиска, твоя, ее надо программировать.

Если не нужно полное oltp и не нужно прямо вот так сразу все искать, что добавляют, рекомендую использовать внешние инкассаторы, например, solr.
...
Рейтинг: 0 / 0
Как правильно сделать поиск по 5 таблицам.
    #38455806
igramnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivigramnet,

Видимо, раз "слово встретилось", то нужен полнотекстовый поиск, т.е. полнотекстовый индекс.
А далее уже — логика поиска, твоя, ее надо программировать.

Если не нужно полное oltp и не нужно прямо вот так сразу все искать, что добавляют, рекомендую использовать внешние инкассаторы, например, solr.

Спасибо за совет. Боюсь с solr разбираться буду долго. Вы бы не могли помочь на готовом примере? Я бы был признателен за вознаграждение.
...
Рейтинг: 0 / 0
Как правильно сделать поиск по 5 таблицам.
    #38456030
artas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igramnet Боюсь с solr разбираться буду долго. Вы бы не могли помочь на готовом примере? Я бы был признателен за вознаграждение.

А тут быстро и примером а ля hello world не отделаетесь, эту логику будете еще 100 раз править прежде чем заработает более менее
...
Рейтинг: 0 / 0
Как правильно сделать поиск по 5 таблицам.
    #38456091
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
igramnet,

сделайте вьюху, в которой будут формироватся "шаблоны поиска" и ищите по ней
типа этого
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
select g.ID as goods_id, s.ID as subsections_id, b.ID as brand_id, .... 
  ,concat('%',s.NAME,/*'%' ?*/' ',b.NAME,/*'%' ?*/' ',g.NAME,'%') as comp1 /* шаблон сравнения 1-го "левела"*/ 
  ,concat('%',b.NAME,/*'%' ?*/' ',g.NAME,'%') as comp2 /* шаблон сравнения 2-го "левела"*/ 
  ,concat('%',g.NAME,'%') as comp3 /* шаблон сравнения 2-го "левела"*/ 
from goods g
inner join subsections s on g.subsection_id=s.ID
inner join brands b on g.BRAND_ID=b.ID

union all

select g.ID as goods_id, s.ID as subsections_id, b.ID as brand_id, ....
  ,concat('%',s.NAME,/*'%' ?*/' ',b.NAME,/*'%' ?*/' ',g.NAME,'%') as comp1 /* шаблон сравнения 1-го "левела"*/ 
  ,concat('%',b.NAME,/*'%' ?*/' ',g.NAME,'%') as comp2 /* шаблон сравнения 2-го "левела"*/ 
  ,concat('%',g.NAME,'%') as comp3 /* шаблон сравнения 2-го "левела"*/ 
from goods g
inner join subsections_alternative s on g.subsection_id=s.SUBSECTION_ID
inner join brands b on g.BRAND_ID=b.ID

union all

select g.ID as goods_id, s.ID as subsections_id, b.ID as brand_id, ....
  ,concat('%',s.NAME,/*'%' ?*/' ',b.NAME,/*'%' ?*/' ',g.NAME,'%') as comp1 /* шаблон сравнения 1-го "левела"*/ 
  ,concat('%',b.NAME,/*'%' ?*/' ',g.NAME,'%') as comp2 /* шаблон сравнения 2-го "левела"*/ 
  ,concat('%',g.NAME,'%') as comp3 /* шаблон сравнения 2-го "левела"*/ 
from goods g
inner join subsections s on g.subsection_id=s.ID
inner join brands_alternative b on g.BRAND_ID=b.BRAND_ID

union all

select g.ID as goods_id, s.ID as subsections_id, b.ID as brand_id, ....
  ,concat('%',s.NAME,/*'%' ?*/' ',b.NAME,/*'%' ?*/' ',g.NAME,'%') as comp1 /* шаблон сравнения 1-го "левела"*/ 
  ,concat('%',b.NAME,/*'%' ?*/' ',g.NAME,'%') as comp2 /* шаблон сравнения 2-го "левела"*/ 
  ,concat('%',g.NAME,'%') as comp3 /* шаблон сравнения 2-го "левела"*/ 
from goods g
inner join subsections_alternative s on g.subsection_id=s.SUBSECTION_ID
inner join brands_alternative b on g.BRAND_ID=b.BRAND_ID


и дальше
1
Код: sql
1.
2.
select v.* from MyView v
where 'телефон Aple iphone 5s' like comp1


2
Код: sql
1.
2.
select v.* from MyView v
where 'телефон Aple iphone 5s' like comp2


3
Код: sql
1.
2.
select v.* from MyView v
where 'телефон Aple iphone 5s' like comp3



зы
возвращаясь к сабжу
Как правильно сделать поиск по 5 таблицам.
лучше будет завести спец.табличку под эти "шаблоны" (а не всё время их генерить во вью), которую "актуализировать" (дополнять для новых товаров, изменять для изменённых и т.д.) в триггерах

тогда можно будет "развернутся" и на перестановки - категория/бренд/модель ==> бренд/модель/категория , ...
+ на сходные по написанию "руские" буквы - '%телефон [AА][рp]l[eе] i[pр]h[оo]n[eе] 5s'
... может ещё что-то ...
...
Рейтинг: 0 / 0
Как правильно сделать поиск по 5 таблицам.
    #38456145
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igramnetMasterZivigramnet,

Видимо, раз "слово встретилось", то нужен полнотекстовый поиск, т.е. полнотекстовый индекс.
А далее уже — логика поиска, твоя, ее надо программировать.

Если не нужно полное oltp и не нужно прямо вот так сразу все искать, что добавляют, рекомендую использовать внешние инкассаторы, например, solr.

Спасибо за совет. Боюсь с solr разбираться буду долго. Вы бы не могли помочь на готовом примере? Я бы был признателен за вознаграждение.

Помочь с чем, с Solr ? Или с логикой твоего поиска ?
...
Рейтинг: 0 / 0
Как правильно сделать поиск по 5 таблицам.
    #38456152
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
даже так, "получшее" будет
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
select g.ID as goods_id, s.ID as subsections_id, b.ID as brand_id, .... 
  ,concat('%',s.NAME,/*'%' ?*/' ',b.NAME,/*'%' ?*/' ',g.NAME,'%') as comp1 /* шаблон сравнения 1-го "левела"*/ 
  ,concat('%',b.NAME,/*'%' ?*/' ',g.NAME,'%') as comp2 /* шаблон сравнения 2-го "левела"*/ 
  ,concat('%',g.NAME,'%') as comp3 /* шаблон сравнения 2-го "левела"*/ 
from goods g
inner join subsections s on g.subsection_id=s.ID
inner join brands b on g.BRAND_ID=b.ID

union all

select g.ID as goods_id, s.ID as subsections_id, b.ID as brand_id, ....
  ,concat('%',s.NAME,/*'%' ?*/' ',b.NAME,/*'%' ?*/' ',g.NAME,'%') as comp1 /* шаблон сравнения 1-го "левела"*/ 
  ,null
  ,null
from goods g
inner join subsections_alternative s on g.subsection_id=s.SUBSECTION_ID
inner join brands b on g.BRAND_ID=b.ID

union all

select g.ID as goods_id, s.ID as subsections_id, b.ID as brand_id, ....
  ,concat('%',s.NAME,/*'%' ?*/' ',b.NAME,/*'%' ?*/' ',g.NAME,'%') as comp1 /* шаблон сравнения 1-го "левела"*/ 
  ,concat('%',b.NAME,/*'%' ?*/' ',g.NAME,'%') as comp2 /* шаблон сравнения 2-го "левела"*/ 
  ,null 
from goods g
inner join subsections s on g.subsection_id=s.ID
inner join brands_alternative b on g.BRAND_ID=b.BRAND_ID

union all

select g.ID as goods_id, s.ID as subsections_id, b.ID as brand_id, ....
  ,concat('%',s.NAME,/*'%' ?*/' ',b.NAME,/*'%' ?*/' ',g.NAME,'%') as comp1 /* шаблон сравнения 1-го "левела"*/ 
  ,concat('%',b.NAME,/*'%' ?*/' ',g.NAME,'%') as comp2 /* шаблон сравнения 2-го "левела"*/ 
  ,null
from goods g
inner join subsections_alternative s on g.subsection_id=s.SUBSECTION_ID
inner join brands_alternative b on g.BRAND_ID=b.BRAND_ID
...
Рейтинг: 0 / 0
Как правильно сделать поиск по 5 таблицам.
    #38456154
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwerty112и дальше
1
Код: sql
1.
2.
select v.* from MyView v
where 'телефон Aple iphone 5s' like comp1



Это не будет работать, если ему действительно надо "если слово из искомой фразы встретилось в".

Это обеспечивает только полнотектный поиск. LIKE так искать не будет.
...
Рейтинг: 0 / 0
Как правильно сделать поиск по 5 таблицам.
    #38456558
igramnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivigramnetпропущено...


Спасибо за совет. Боюсь с solr разбираться буду долго. Вы бы не могли помочь на готовом примере? Я бы был признателен за вознаграждение.

Помочь с чем, с Solr ? Или с логикой твоего поиска ?

С выполнением задания ;) Нужно поиск допилить так сказать. Я попробую запрос, описанный выше. Но хотелось бы получить квалифицированную помощь.
...
Рейтинг: 0 / 0
Как правильно сделать поиск по 5 таблицам.
    #38456606
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
это - тоже лишнее
qwerty112даже так, "получшее" будет
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
select g.ID as goods_id, s.ID as subsections_id, b.ID as brand_id, .... 
  ,concat('%',s.NAME,/*'%' ?*/' ',b.NAME,/*'%' ?*/' ',g.NAME,'%') as comp1 /* шаблон сравнения 1-го "левела"*/ 
  ,concat('%',b.NAME,/*'%' ?*/' ',g.NAME,'%') as comp2 /* шаблон сравнения 2-го "левела"*/ 
  ,concat('%',g.NAME,'%') as comp3 /* шаблон сравнения 3-го "левела"*/ 
from goods g
inner join subsections s on g.subsection_id=s.ID
inner join brands b on g.BRAND_ID=b.ID

union all

select g.ID as goods_id, s.ID as subsections_id, b.ID as brand_id, ....
  ,concat('%',s.NAME,/*'%' ?*/' ',b.NAME,/*'%' ?*/' ',g.NAME,'%') as comp1 /* шаблон сравнения 1-го "левела"*/ 
  ,null
  ,null
from goods g
inner join subsections_alternative s on g.subsection_id=s.SUBSECTION_ID
inner join brands b on g.BRAND_ID=b.ID

union all

select g.ID as goods_id, s.ID as subsections_id, b.ID as brand_id, ....
  ,concat('%',s.NAME,/*'%' ?*/' ',b.NAME,/*'%' ?*/' ',g.NAME,'%') as comp1 /* шаблон сравнения 1-го "левела"*/ 
  ,concat('%',b.NAME,/*'%' ?*/' ',g.NAME,'%') as comp2 /* шаблон сравнения 2-го "левела"*/ 
  ,null 
from goods g
inner join subsections s on g.subsection_id=s.ID
inner join brands_alternative b on g.BRAND_ID=b.BRAND_ID

union all

select g.ID as goods_id, s.ID as subsections_id, b.ID as brand_id, ....
  ,concat('%',s.NAME,/*'%' ?*/' ',b.NAME,/*'%' ?*/' ',g.NAME,'%') as comp1 /* шаблон сравнения 1-го "левела"*/ 
  ,null
  ,null
from goods g
inner join subsections_alternative s on g.subsection_id=s.SUBSECTION_ID
inner join brands_alternative b on g.BRAND_ID=b.BRAND_ID
...
Рейтинг: 0 / 0
Как правильно сделать поиск по 5 таблицам.
    #38456684
igramnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwerty112это - тоже лишнее
qwerty112даже так, "получшее" будет
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
select g.ID as goods_id, s.ID as subsections_id, b.ID as brand_id, .... 
  ,concat('%',s.NAME,/*'%' ?*/' ',b.NAME,/*'%' ?*/' ',g.NAME,'%') as comp1 /* шаблон сравнения 1-го "левела"*/ 
  ,concat('%',b.NAME,/*'%' ?*/' ',g.NAME,'%') as comp2 /* шаблон сравнения 2-го "левела"*/ 
  ,concat('%',g.NAME,'%') as comp3 /* шаблон сравнения 3-го "левела"*/ 
from goods g
inner join subsections s on g.subsection_id=s.ID
inner join brands b on g.BRAND_ID=b.ID

union all

select g.ID as goods_id, s.ID as subsections_id, b.ID as brand_id, ....
  ,concat('%',s.NAME,/*'%' ?*/' ',b.NAME,/*'%' ?*/' ',g.NAME,'%') as comp1 /* шаблон сравнения 1-го "левела"*/ 
  ,null
  ,null
from goods g
inner join subsections_alternative s on g.subsection_id=s.SUBSECTION_ID
inner join brands b on g.BRAND_ID=b.ID

union all

select g.ID as goods_id, s.ID as subsections_id, b.ID as brand_id, ....
  ,concat('%',s.NAME,/*'%' ?*/' ',b.NAME,/*'%' ?*/' ',g.NAME,'%') as comp1 /* шаблон сравнения 1-го "левела"*/ 
  ,concat('%',b.NAME,/*'%' ?*/' ',g.NAME,'%') as comp2 /* шаблон сравнения 2-го "левела"*/ 
  ,null 
from goods g
inner join subsections s on g.subsection_id=s.ID
inner join brands_alternative b on g.BRAND_ID=b.BRAND_ID

union all

select g.ID as goods_id, s.ID as subsections_id, b.ID as brand_id, ....
  ,concat('%',s.NAME,/*'%' ?*/' ',b.NAME,/*'%' ?*/' ',g.NAME,'%') as comp1 /* шаблон сравнения 1-го "левела"*/ 
  ,null
  ,null
from goods g
inner join subsections_alternative s on g.subsection_id=s.SUBSECTION_ID
inner join brands_alternative b on g.BRAND_ID=b.BRAND_ID





Так, запрос получил. А где задавать строку? Например, "Aple Iphone 5s"
...
Рейтинг: 0 / 0
Как правильно сделать поиск по 5 таблицам.
    #38458439
igramnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как организовать сам поиск? По данному запросу я получаю таблицу со столбцами для поиска. А что с ней дальше делать?
...
Рейтинг: 0 / 0
Как правильно сделать поиск по 5 таблицам.
    #38458447
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
igramnetКак организовать сам поиск? По данному запросу я получаю таблицу со столбцами для поиска. А что с ней дальше делать?
топик перечитай
...
Рейтинг: 0 / 0
Как правильно сделать поиск по 5 таблицам.
    #38458474
igramnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwerty112igramnetКак организовать сам поиск? По данному запросу я получаю таблицу со столбцами для поиска. А что с ней дальше делать?
топик перечитай

да я понял. Вы предлагаете сделать таблица отдельную, в которой хранить результаты запроса этого большого. И потом по ней искать. Но вопрос в том, что надо получается каждый раз чистить данную таблицу, когда создается или меняется товар в базе (бренд или категория) ?
...
Рейтинг: 0 / 0
Как правильно сделать поиск по 5 таблицам.
    #38459016
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
igramnetqwerty112пропущено...

топик перечитай

да я понял. Вы предлагаете сделать таблица отдельную, в которой хранить результаты запроса этого большого. И потом по ней искать. Но вопрос в том, что надо получается каждый раз чистить данную таблицу, когда создается или меняется товар в базе (бренд или категория) ?
а этаа, ... ты на чём пишешь ? на пхп ?
...
Рейтинг: 0 / 0
Как правильно сделать поиск по 5 таблицам.
    #38459123
igramnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwerty112igramnetпропущено...


да я понял. Вы предлагаете сделать таблица отдельную, в которой хранить результаты запроса этого большого. И потом по ней искать. Но вопрос в том, что надо получается каждый раз чистить данную таблицу, когда создается или меняется товар в базе (бренд или категория) ?
а этаа, ... ты на чём пишешь ? на пхп ?

да, на PHP.

Я вообще подумал создать таблицу, в которой будут уже заранее всевозможные варианты комбинацией названия, бренда, категории и альтернативных название бренда и категории....
и по ней организовать полнотекстовый поиск. Как думаете, так будет правильно?
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как правильно сделать поиск по 5 таблицам.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]