MySQL оператор SELECT, где параметр запроса имеет больше символов, чем содержимое в базе данных - PullRequest
2 голосов
/ 17 апреля 2019

Допустим, у меня есть таблица city, как показано ниже

+-----+-------------------------+------+
| id  | city_name               | item |
+-----+-------------------------+------+
| 1   | kota jakarta            |  5   |
| 2   | tangerang               |  6   |
| 3   | kota tangerang selatan  |  7   |
| 4   | kota tangerang          |  8   |

, в этом случае я получу строковый ввод для оператора SELECT, например:

input =« Кота Джакарта Барат » или « Кота Джакарта Селатан », и я не могу контролировать ввод, он поступает из веб-запроса.

мой вопрос:

(1) как сделать SELECT оператор запроса, используя приведенный выше ввод, чтобы получить точно запись результата = " кота джакарта "?

Я не могу использовать SELECT city_name FROM city WHERE city_name like %kota jakarta barat%, потому что он ничего не вернет.

Заранее спасибо ...

Ответы [ 5 ]

1 голос
/ 27 апреля 2019

План A:

FULLTEXT(city)

SELECT ...
    WHERE    MATCH(city) AGAINST("...")
    ORDER BY MATCH(city) AGAINST("...") DESC

Это может привести к нежелательным результатам, например, "foo jakarta selatan"

План B:

Это будет медленно, ноточно ищет префикс в таблице:

WHERE LEFT("...", LENGTH(city)) = city

Но это предполагает, что в качестве нужного города используется префикс запрошенной строки.

Вы можете добавить это начтобы получить «лучший» матч:

ORDER BY LENGTH(city) DESC
1 голос
/ 20 апреля 2019

Попробуйте это:

SELECT city_name AS result 
FROM city 
INNER JOIN (SELECT 'kota tangerang selatan' AS input) i 
ON city.city_name=IF(city.city_name=i.input,i.input,SUBSTRING_INDEX(input,' ',2))
GROUP BY input;
0 голосов
/ 17 апреля 2019

Если ваш вопрос: «Когда я пишу« Кота-Джакарта-Барат », я хочу видеть записи, которые содержат как« Кота », так и« Джакарта »и« Барат »), думаю, вы можете дать представление:

    INPUT = SUBSTRING("kota jakarta barat",1, POSITION(" " IN "kota jakarta barat")-1); --kota
INPUTLENGHT = LENGHT("kota jakarta barat"); --18 
POSITION("" IN (SUBSTRING("kota jakarta barat",POSITION(" " IN "kota jakarta barat")+1,INPUTLENGHT))); --8
INPUT2 = SUBSTRING("kota jakarta barat",POSITION(" " IN "kota jakarta barat"),POSITION("" IN (SUBSTRING("kota jakarta barat",POSITION(" " IN "kota jakarta barat")+1,INPUTLENGHT)))); --jakarta


SELECT city_name FROM city WHERE (city_name LIKE %INPUT% OR city_name LIKE %INPUT2% OR city_name LIKE %INPUT3%) ; 
0 голосов
/ 17 апреля 2019

Вам, вероятно, следует изменить шаблон, чтобы он стал регулярным выражением.Следующее получит частичное совпадение:

where city_name regexp replace('kota jakarta selatan', ' ', '|')

РЕДАКТИРОВАТЬ:

Вы также можете попробовать:

where 'kota jakarta selatan' like concat(city_name, '%')

Это работает для вашего конкретного примера.

0 голосов
/ 17 апреля 2019

это будет работать:

SELECT city_name FROM Table1 
WHERE SOUNDEX(substring(city_name,1,12))= SOUNDEX(substring('kota 
jakarta',1,12));

или

SELECT city_name FROM city WHERE  SOUNDEX(substring(city_name,1,12))= 
SOUNDEX(substring(your input,1,12);

проверка: http://sqlfiddle.com/#!9/fc93c33/4

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...