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

Есть 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
07.11.2013, 11:11:03
    #38455691
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать поиск по 5 таблицам.
igramnet,

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

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

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

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

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

А тут быстро и примером а ля hello world не отделаетесь, эту логику будете еще 100 раз править прежде чем заработает более менее
...
Рейтинг: 0 / 0
07.11.2013, 13:47:26
    #38456091
qwerty112
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать поиск по 5 таблицам.
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
07.11.2013, 14:08:29
    #38456145
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать поиск по 5 таблицам.
igramnetMasterZivigramnet,

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

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

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

Помочь с чем, с Solr ? Или с логикой твоего поиска ?
...
Рейтинг: 0 / 0
07.11.2013, 14:10:27
    #38456152
qwerty112
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать поиск по 5 таблицам.
даже так, "получшее" будет
Код: 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
07.11.2013, 14:10:50
    #38456154
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать поиск по 5 таблицам.
qwerty112и дальше
1
Код: sql
1.
2.
select v.* from MyView v
where 'телефон Aple iphone 5s' like comp1



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

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


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

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

С выполнением задания ;) Нужно поиск допилить так сказать. Я попробую запрос, описанный выше. Но хотелось бы получить квалифицированную помощь.
...
Рейтинг: 0 / 0
07.11.2013, 17:15:47
    #38456606
qwerty112
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать поиск по 5 таблицам.
это - тоже лишнее
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
07.11.2013, 17:48:41
    #38456684
igramnet
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать поиск по 5 таблицам.
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
08.11.2013, 20:52:44
    #38458439
igramnet
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать поиск по 5 таблицам.
Как организовать сам поиск? По данному запросу я получаю таблицу со столбцами для поиска. А что с ней дальше делать?
...
Рейтинг: 0 / 0
08.11.2013, 21:10:36
    #38458447
qwerty112
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать поиск по 5 таблицам.
igramnetКак организовать сам поиск? По данному запросу я получаю таблицу со столбцами для поиска. А что с ней дальше делать?
топик перечитай
...
Рейтинг: 0 / 0
08.11.2013, 21:54:26
    #38458474
igramnet
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать поиск по 5 таблицам.
qwerty112igramnetКак организовать сам поиск? По данному запросу я получаю таблицу со столбцами для поиска. А что с ней дальше делать?
топик перечитай

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

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

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


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

да, на PHP.

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


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