Я беспокоюсь, что это немного дорого.
Плюс я скоро реализую нормализованную систему для тегов, поэтому будут дополнительные объединения.
Кроме того, у меня есть 4 таблицы (tbl_videos, tbl_articles, tbl_galleries и tbl_users), из которых я хочу отобразить три результата каждого из них и, следовательно, придется четыре раза запускать запрос при одном нажатии "поиска".
SELECT *,
(
(CASE WHEN `description` LIKE '%hotel%' THEN 1 ELSE 0 END) +
(CASE WHEN `description` LIKE '%london%' THEN 1 ELSE 0 END) +
(CASE WHEN `description` LIKE '%lazy%' THEN 1 ELSE 0 END) +
(CASE WHEN `description` LIKE '%dog%' THEN 1 ELSE 0 END) +
(CASE WHEN `title` LIKE '%hotel%' THEN 1 ELSE 0 END) +
(CASE WHEN `title` LIKE '%london%' THEN 1 ELSE 0 END) +
(CASE WHEN `title` LIKE '%lazy%' THEN 1 ELSE 0 END) +
(CASE WHEN `title` LIKE '%dog%' THEN 1 ELSE 0 END) +
(CASE WHEN `tags` LIKE '%hotel%' THEN 1 ELSE 0 END) +
(CASE WHEN `tags` LIKE '%london%' THEN 1 ELSE 0 END) +
(CASE WHEN `tags` LIKE '%lazy%' THEN 1 ELSE 0 END) +
(CASE WHEN `tags` LIKE '%dog%' THEN 1 ELSE 0 END)
) AS relevance
FROM `table`
WHERE `description` LIKE '%hotel%'
OR `description` LIKE '%london%'
OR `description` LIKE '%lazy%'
OR `description` LIKE '%dog%'
OR `title` LIKE '%hotel%'
OR `title` LIKE '%london%'
OR `title` LIKE '%lazy%'
OR `title` LIKE '%dog%'
OR `tags` LIKE '%hotel%'
OR `tags` LIKE '%london%'
OR `tags` LIKE '%lazy%'
OR `tags` LIKE '%dog%'
ORDER BY relevance DESC
LIMIT 0 , 3;
Да, это, вероятно, будет довольно ресурсоемким, но похоже, что перед тем, как отправить запрос, у вас есть бизнес-уровень.
Подумайте о том, чего вы хотите достичь, и о том, что вы могли бы сделать сами, с точки зрения разбора поисковых запросов или даже предоставления отдельным полям для описания, заголовка и тэгов и правильного построения запроса, чтобы а не эффективно сказать: "У меня есть некоторые данные, похожие на этот термин поиска, где-то в столбцах этой таблицы".
После того, как вы определились в своей бизнес-логике (и если приведенный выше запрос - это то, как он заканчивается, хотя я сомневаюсь в этом, тогда sobeit), то вы должны обязательно запустить запрос через план объяснения и посмотреть, где вы можете забрать некоторые индексы, чтобы помочь базе данных.
EDIT:
Хорошо, так как это для предложения
select matched_val, relevance from (
select description as matched_val, count(*) as relevance
from table
where description like '%hotel%'
or description like '%london%'
or description like '%lazy%'
or description like '%dog%'
group by description
union all
select title as matched_val, count(*) as relevance
from table
where title like '%hotel%'
or title like '%london%'
or title like '%lazy%'
or title like '%dog%'
group by title
union all
select tags as matched_val, count(*) as relevance
from table
where tags like '%hotel%'
or tags like '%london%'
or tags like '%lazy%'
or tags like '%dog%'
group by tags
) as a
order by a.relevance desc
LIMIT 0 , 3
это, по крайней мере, означает, что вам нужно выполнить только одно совпадение, а не в предикате и в операторе switch, плюс оптимизатор сможет использовать индекс для описания, заголовка и тегов (которые вам понадобятся добавьте себя), и вы должны быть в отъезде.
Пойдем и посмотрим, как понравится ваш оптимизатор запросов...