Задать вопрос

Как сделать выборку и поиск по трем таблицам в MySQL?

Писал уже этот вопрос, но напишу снова, так как сделать нужно это очень быстро, а курить доки по поисковым движкам времени точно нет.

Собственно пишу поиск товаров для сайта. Поиск должен быть максимально простым. Есть множество таблиц, абсолютно абстрагированных друг от друга.
То есть для каждого типа товаров есть таблица с полями name и html (полное описание с разметкой WYSIWYG)
Поисковый запрос может состоять из нескольких слов. Для одной таблицы и двух слов все супер, делаю запрос так:
SELECT *, (
IF (tb_table1.name LIKE '%Ляля лала%', 2, 0) + 
IF (tb_table1.name LIKE '%Ляля%', 1, 0) + 
IF (tb_table1.name LIKE '%лала%', 1, 0) + 
IF (tb_table1.html LIKE '%Ляля лала%', 2, 0) + 
IF (tb_table1.html LIKE '%Ляля%', 1, 0) + 
IF (tb_table1.html LIKE '%лала%', 1, 0)
) AS points FROM tb_table1 ORDER BY points DESC LIMIT 20


Но как это провернуть и с остальными таблицами? Всю голову сломал...
Заранее благодарю за ответ.
  • Вопрос задан
  • 322 просмотра
Подписаться 2 Оценить Комментировать
Решения вопроса 1
medvedhack
@medvedhack Автор вопроса
Все, разобрался сам, 3 часа курения доков и вот кривой результат, но работает довольно шустро:
(SELECT `id`,`tag`,`name`,`html`,`img`, '1' as `type`, `category`, (IF (tb_table1.name LIKE '%Бао лала%', 2, 0) + IF (tb_table1.name LIKE '%Бао%', 1, 0) + IF (tb_table1.name LIKE '%лала%', 1, 0)) AS points FROM tb_table1)
UNION
(SELECT `id`,`tag`,`name`,`html`,`img`, '2' as `type`, `category`, (IF (tb_table2.name LIKE '%Бао лала%', 2, 0) + IF (tb_table2.name LIKE '%Бао%', 1, 0) + IF (tb_table2.name LIKE '%лала%', 1, 0)) AS points FROM tb_table2) 
UNION 
(SELECT `id`,`tag`,`name`,`html`,`img`, '3' as `type`, '0' as `category`, (IF (tb_table3.name LIKE '%Бао лала%', 2, 0) + IF (tb_table3.name LIKE '%Бао%', 1, 0) + IF (tb_table3.name LIKE '%лала%', 1, 0)) AS points FROM tb_table3) 
UNION 
(SELECT `id`,`tag`,`name`,`html`,`img`, '4' as `type`, '0' as `category`, (IF (tb_table4.name LIKE '%Бао лала%', 2, 0) + IF (tb_table4.name LIKE '%Бао%', 1, 0) + IF (tb_table4.name LIKE '%лала%', 1, 0)) AS points FROM tb_table4) 
ORDER BY points DESC LIMIT 20
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@dmitryKovalskiy
программист средней руки
Проблема в том что вы сделали "множество таблиц, абсолютно абстрагированных друг от друга".
А они такими быть не должны. Делайте множество подобных запросов к каждой таблице или нормализуйте структуру и можно будет уже писать что-то более конкретное. Если таблицы не "абсолютно абстрагированны друг от друга", то их можно объединять через JOIN и делать 1 запрос вместо 10.
Ответ написан
Denormalization
@Denormalization
Может стоит забить на полнотекстовый поиск в Mysql, и использовать для этого тот же Elastic/Sphinx?
Построить индекс и делать нормальный поиск.
Ответ написан
Комментировать
rtutin
@rtutin
Быдлокодер, анархист, аутист
Используй JOIN.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы