Как сделать быстрый sql-запрос поиска по первым трем буквам?

причем на 1й позиции может быть одна из трех букв, на второй одна из других трех и третья тоже

т.е.

qwe, rty, uio

надо найти где столбец name начинается: qru%, wyo%, qro%,wti%, итд т.е. 27 комбинаций
  • Вопрос задан
  • 2435 просмотров
Пригласить эксперта
Ответы на вопрос 3
MaxDukov
@MaxDukov
впишусь в проект как SRE/DevOps.
и снова OK Google
CREATE INDEX NAME_OF_MY_INDEX ON NAME_OF_MY_TABLE (NAME_OF_FIELD(3));

- создаете индекс только по первым трем символам поля.
Ответ написан
@dmitryKovalskiy
программист средней руки
Насчет быстрого не знаю, но я бы написал как-то так
SELECT id,name, substring(name,1,3) as threeLetters
WHERE threeeLetters IN(SomeSource)

UPD :
SELECT id, name from _pc_PartnerRequest
WHERE SUBSTRING(name,1,3) IN (someSource)

Так точно сработает. Но опять же - вопрос насколько быстро
Ответ написан
@heartdevil
плыву как воздушный шарик
Привет.

Вот так, думаю, можно.

-- Временная таблица для разложения qwe на буквы
CREATE TEMPORARY TABLE qwe (letter VARCHAR (10));

INSERT INTO qwe (letter) VALUES('q');
INSERT INTO qwe (letter) VALUES('w');
INSERT INTO qwe (letter) VALUES('e');

-- Временная таблица для разложения rty на буквы
CREATE TEMPORARY TABLE rty (letter VARCHAR (10));

INSERT INTO rty (letter) VALUES('r');
INSERT INTO rty (letter) VALUES('t');
INSERT INTO rty (letter) VALUES('y');

-- Временная таблица для разложения uio на буквы
CREATE TEMPORARY TABLE uio (letter VARCHAR (10));

INSERT INTO uio (letter) VALUES('u');
INSERT INTO uio (letter) VALUES('i');
INSERT INTO uio (letter) VALUES('o');

-- Тестовая таблица для поиска.
CREATE TEMPORARY TABLE abc (letter VARCHAR (10));

INSERT INTO abc (letter) VALUES('u');
INSERT INTO abc (letter) VALUES('qtiskdk');
INSERT INTO abc (letter) VALUES('eyudkdk');
INSERT INTO abc (letter) VALUES('zzzzzzzzz');

-- SELECT CONCAT(qwe.letter, rty.letter, uio.letter, '%') AS pref FROM qwe, rty, uio -- этот запрос вернет cross join для всех сочетаний букв в нужном порядке. Для всех сочетаний будет добавлен знак % в конце.
-- Теперь объединяем две таблицы и выводим только те записи которые удовлетворяют условию LIKE

SELECT * FROM abc AS t
INNER JOIN (SELECT CONCAT(qwe.letter, rty.letter, uio.letter, '%') AS pref FROM qwe, rty, uio) AS c
ON t.letter LIKE c.pref
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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