2015-04-07 3 views
0

Я хотел бы выполнить запрос MYSQL для выбора элементов, где заголовок в базе данных каким-то образом содержит пользовательский ввод. Для того, чтобы понять, что я хочу:Как выбрать столбец, содержащий ввод пользователя?

Заголовок в базе данных может быть

"The three kids are playing in the yard". 

Пользователь может искать «дети играют», и я хочу, чтобы он нашел этот титул. В настоящее время я использую

SELECT title FROM someTable WHERE title LIKE "%sometitle%"` 

Однако это won't вернуть титул, как слово «являются» отсутствует на входе пользователя и, следовательно, ничего не будет возвращено. Есть ли способ выбрать заголовок, когда пользователь не вводит тот же порядок слов, что и в названии?

ответ

1

Один простой способ сделать это было бы разделить слово для поиска в «дети» и «играть» и генерировать LIKE заявление динамически во что-то вроде этого:

SELECT title FROM someTable WHERE title LIKE '%FIRST%SECOND%' 

Здесь FIRST будет заменена детьми и SECOND будет заменен игрой. Таким образом, вы фактически вставляете% между каждым поисковым термином.

+0

Работает как очарование, спасибо! – phpheini

+0

Добро пожаловать. Рад, что смог помочь :) – Plasher

0

В качестве альтернативы вы можете сделать это с помощью MySQL full Text search также:

Либо Boolean Full Text Search Или Full Text Search using Query Expansion.

Давайте посмотрим на Boolean Full Text Search;

Пример таблицы, как указано на dev.mysql.com:

mysql> select * from articles; 
+----+-----------------------+------------------------------------------+ 
| id | title     | body          | 
+----+-----------------------+------------------------------------------+ 
| 1 | PostgreSQL Tutorial | DBMS stands for DataBase ...    | 
| 2 | How To Use MySQL Well | After you went through a ...    | 
| 3 | Optimizing MySQL  | In this tutorial we will show ...  | 
| 4 | 1001 MySQL Tricks  | 1. Never run mysqld as root. 2. ...  | 
| 5 | MySQL vs. YourSQL  | In the following database comparison ... | 
| 6 | MySQL Security  | When configured properly, MySQL ...  | 
+----+-----------------------+------------------------------------------+ 

mysql> SELECT * FROM articles WHERE MATCH (title,body) 
    AGAINST ('"database comparison"' IN BOOLEAN MODE); 

+----+-------------------+------------------------------------------+ 
| id | title    | body          | 
+----+-------------------+------------------------------------------+ 
| 5 | MySQL vs. YourSQL | In the following database comparison ... | 
+----+-------------------+------------------------------------------+ 

вопросы заказа, когда слова цитируются:

mysql> SELECT * FROM articles WHERE MATCH (title,body) 
    AGAINST ('"comparison database"' IN BOOLEAN MODE); 

Empty set (0.01 sec) 

Когда мы убираем цитаты, он будет искать строки, содержащие слова «база данных» или «сравнения»:

mysql> SELECT * FROM articles WHERE MATCH (title,body) 
    AGAINST ('database comparison' IN BOOLEAN MODE); 

+----+---------------------+------------------------------------------+ 
| id | title    | body          | 
+----+---------------------+------------------------------------------+ 
| 1 | PostgreSQL Tutorial | DBMS stands for DataBase ...    | 
| 5 | MySQL vs. YourSQL | In the following database comparison ... | 
+----+---------------------+------------------------------------------+ 

Заказать сейчас не важно:

mysql> SELECT * FROM articles WHERE MATCH (title,body) 
    AGAINST ('comparison database' IN BOOLEAN MODE); 

+----+---------------------+------------------------------------------+ 
| id | title    | body          | 
+----+---------------------+------------------------------------------+ 
| 1 | PostgreSQL Tutorial | DBMS stands for DataBase ...    | 
| 5 | MySQL vs. YourSQL | In the following database comparison ... | 
+----+---------------------+------------------------------------------+ 

Если мы хотим получить строки, содержащие либо слово «PostgreSQL» или фразу «сравнения баз данных», мы должны использовать этот запрос:

mysql> SELECT * FROM articles WHERE MATCH (title,body) 
    AGAINST ('PostgreSQL "database comparison"' IN BOOLEAN MODE); 

+----+---------------------+------------------------------------------+ 
| id | title    | body          | 
+----+---------------------+------------------------------------------+ 
| 1 | PostgreSQL Tutorial | DBMS stands for DataBase ...    | 
| 5 | MySQL vs. YourSQL | In the following database comparison ... | 
+----+---------------------+------------------------------------------+ 

Fiddle To Try

Убедитесь, что слова , которые вы ищете, не находятся в list of stopwords, которые игнорируются.
(и, очевидно, такие слова, как «есть», «тем» является stopwords и теми игнорировала)

Для улучшения сортировки результатов в булевом режиме вы можете использовать следующие запросы:

(Если у вас есть всего 2 слова в строке ввода пользователя) Затем.

SELECT column_names, MATCH (text) AGAINST ('word1 word2') 
AS col1 FROM table1 
WHERE MATCH (text) AGAINST ('+word1 +word2' in boolean mode) 
order by col1 desc; 

(Если у вас есть 3 слова в строки ввода пользователя), а затем ..

SELECT column_names, MATCH (text) AGAINST ('word1 word2 word3') 
AS col1 FROM table1 
WHERE MATCH (text) AGAINST ('+word1 +word2 +word3' in boolean mode) 
order by col1 desc; 

Использование первыйMATCH()мы получаем счет в не булевой режиме поиска (более своеобразны) , второйMATCH()гарантирует, что мы действительно вернем только те результаты, которые хотим (всего 3 слова).