2013-11-30 2 views
0

Я пытаюсь сделать функцию, похожую на страницу поиска. Я хочу сделать запрос для поиска «запроса» в «ColumnA» и «ColumnB» и «ColumnC» и «ColumnD». И выберите строки, в которых есть слово/фраза «запрос» в любом из этих столбцов. Это, кажется, работает:MySQL: Ищите ту же строку в нескольких столбцах

SELECT * FROM projects 
    WHERE 
    category LIKE '%query%' OR 
    name LIKE '%query%' OR 
    description LIKE '%query%'OR 
    keywords LIKE '%query%' OR 
    'type' LIKE '%query%' 
    ORDER BY name ASC 

Но это длительный. Есть ли более простой или эффективный способ сделать это?

+0

лучшим вариантом является создание отношения многие ко многим с искомыми словами llnkt к вашим проектам таблицы таким образом, вы можете избежать использования типа «%%» (требуется полное сканирование индекса или полное сканирование таблицы) или использование индекса FULL TEXT. –

ответ

8

Простой обходной путь:

SELECT * 
FROM projects 
WHERE 
    CONCAT(category,name,description,keywords,type) LIKE '%query%' 
ORDER BY name ASC; 

Вы можете добавить разделители между столбцами, если это необходимо:

SELECT * 
FROM projects 
WHERE 
    CONCAT(category,"|",name,"|",description,"|",keywords,"|",type) LIKE '%query%' 
ORDER BY name ASC; 

Вы также можете использовать полнотекстовый поиск (вам нужно создать полнотекстовый индекс, как описано здесь: How do FULLTEXT INDEXES on multiple columns work?)

SELECT *, MATCH (category,name,description,keywords,type) AGAINST ('query') AS score FROM projects WHERE MATCH (category,name,description,keywords,type) AGAINST ('query'); 
+0

'# 1305 - FUNCTION

.CONCATENATE не существует' Я получаю эта ошибка. :/ – mreethmandir

+0

упс, это CONCAT, просто исправил ответ :) – ceyquem

0

Но это i длительный.

Я думаю, что это не проблема. запрос может быть создан клиентской стороной.

Есть ли более простой или эффективный способ сделать это?

Использование Sphinx или Solr с MySQL. Это не сложно и очень быстро. Вот пример Сфинкса. http://www.ibm.com/developerworks/library/os-php-sphinxsearch/

, и я думаю, что CONCAT не эффективен, как ваш, существует стоимость объединения столбцов (некоторые столбцы могут быть длинными текстами). CONCAT(name, description) LIKE '%query%' читает name и description и выполняет два значения после того, как применяется LIKE. это означает, что все столбцы READ два раза, в то время как ваш запрос может быть заполнен только первым столбцом. Все условие равно «OR», поэтому столбец category сопоставляет% query%, что строка не нужно сравнивать с столбцом «имя».

FYI

просто FYI, ниже запрос может проверить, какой столбец имеет более «запрос»

SELECT name, 
    (LENGTH(category) - LENGTH(REPLACE(category, 'query', '')))/LENGTH('query') as category_match_cnt, 
    (LENGTH(name) - LENGTH(REPLACE(name, 'query', '')))/LENGTH('query') as name_match_cnt, 
    (LENGTH(description) - LENGTH(REPLACE(description, 'query', '')))/LENGTH('query') as desc_match_cnt, 
Смежные вопросы