Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос на выбор по лучшему совпадению при переборе значений / 16 сообщений из 16, страница 1 из 1
16.03.2019, 04:25
    #39787086
Dlemfe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выбор по лучшему совпадению при переборе значений
Имеется таблица `mytable` вида:
id | column1 | column2
1 | AAA-123456789 | NULL
2 | AAA-123456781 | Q
3 | AAA-123456711 | W
4 | AAA-123456111 | E
5 | BBB-123456789 | R

Имеется строка для поиска " AAA-123456785 " в `column1`.

1-й запрос:
Должен возвращать одну строку, значение `column1` в которой максимально близко к искомому при `column2` IS NOT NULL, отнимая в строке поиска символы справа (максимум 3 символа, например).
Т.е. ищем " AAA-123456785 ", потом " AAA-12345678 ", " AAA-1234567 ", " AAA-123456 ".
Результат:
id | column1 | column2
2 | AAA-12345678 1 | Q

2-й запрос:
Должен возвращать все строки, в которых находились искомые значения, отсортированные по лучшему совпадению.
Результат:
id | column1 | column2
2 | AAA-12345678 1 | Q
3 | AAA-1234567 11 | W
4 | AAA-123456 111 | E

Либо, если возможно, то вместо исходных значений в `column1`, отобразить только маску поиска, дополненную "_" (без изменения исходных данный в таблице):
id | column1 | column2
2 | AAA-12345678 _ | Q
3 | AAA-1234567 __ | W
4 | AAA-123456 ___ | E

Понимаю, что у лучшего совпадения будет минимальное количество вхождений, но имеющихся знаний языка, к сожалению, не достаточно, чтобы составить данные запросы, буду очень благодарен за помощь.
...
Рейтинг: 0 / 0
16.03.2019, 12:10
    #39787123
Dlemfe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выбор по лучшему совпадению при переборе значений
Пока могу только выбрать интересующие записи таким вот запросом и максимум отсортировать во возрастанию/убыванию какой-нибудь колонки
Код: sql
1.
2.
3.
4.
5.
SELECT * FROM `mytable` WHERE 
`column1` LIKE 'AAA-123456785%' AND `column2` IS NOT NULL OR 
`column1` LIKE 'AAA-12345678%' AND `column2` IS NOT NULL OR 
`column1` LIKE 'AAA-1234567%' AND `column2` IS NOT NULL OR 
`column1` LIKE 'AAA-123456%' AND `column2` IS NOT NULL



Результат:
id column1 column22 AAA-123456781 Q3 AAA-123456711 W4 AAA-123456111 E

И я совсем не соображаю, как переделать этот запрос под интересующие меня нужды (
...
Рейтинг: 0 / 0
16.03.2019, 22:02
    #39787222
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выбор по лучшему совпадению при переборе значений
DlemfeДолжен возвращать одну строку,А если их, совпадающих без одного последнего символа, окажется две? AAA-12345678 1 и AAA-12345678 9?
Dlemfeбуду очень благодарен за помощь.Сперва укажите точную версию сервера.
...
Рейтинг: 0 / 0
17.03.2019, 05:11
    #39787250
Dlemfe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выбор по лучшему совпадению при переборе значений
AkinaА если их, совпадающих без одного последнего символа, окажется две? AAA-12345678 1 и AAA-12345678 9?
Тогда будет интересовать запись, у которой больше id

AkinaСперва укажите точную версию сервера.
Сервер: MySQL (Localhost via UNIX socket)
Тип сервера: MariaDB
Версия сервера: 10.0.37-MariaDB - MariaDB Server
Версия протокола: 10
...
Рейтинг: 0 / 0
17.03.2019, 07:05
    #39787256
Dlemfe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выбор по лучшему совпадению при переборе значений
Как я понял, IF в моем случае можно использовать только в процедуре, написал такой код:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DELIMITER $
DROP PROCEDURE IF EXISTS pr $
CREATE PROCEDURE pr()
BEGIN
    IF (SELECT COUNT(*) FROM `mytable` WHERE `column1` LIKE 'AAA-12345678%' AND `column2` IS NOT NULL) > 0 THEN
    	SELECT * FROM `mytable` WHERE `column1` LIKE 'AAA-12345678%' AND `column2` IS NOT NULL ORDER BY id DESC LIMIT 1;
    END IF;
END $
DELIMITER ;
CALL pr;



Возвращает нужную строку, но пока еще не разобрался:
- как объявить текстовую ПЕРЕМЕННУЮ и присвоить ей значение 'AAA-123456785'
- организовать внутри BEGIN цикл с возможностью выхода из него
- как отнимать от переменной со значением 'AAA-123456785' по одному символу справа в цикле из разряда myparam = left(myparam.lenght-1)
...
Рейтинг: 0 / 0
17.03.2019, 07:53
    #39787260
Dlemfe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выбор по лучшему совпадению при переборе значений
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
DELIMITER $
DROP PROCEDURE IF EXISTS pr $
CREATE PROCEDURE pr()
BEGIN
	SET @myparam='AAA-123456785';    
    SET @i = 3;    
    
    WHILE @i >= 0 DO    
        IF (SELECT COUNT(*) FROM `mytable` WHERE `column1` LIKE CONCAT(@myparam, '%') AND `column2` IS NOT NULL) > 0 THEN
            SELECT * FROM `mytable` WHERE `column1` LIKE CONCAT(@myparam, '%') AND `column2` IS NOT NULL ORDER BY id DESC LIMIT 1;
            SET @i=0;
        END IF;        
        SET @myparam= LEFT(@myparam, CHARACTER_LENGTH(@myparam)-1);
    	SET @i = @i- 1;        
  	END WHILE;
END $
DELIMITER ;
CALL pr;



Вроде с 1-м запросом справился, но есть вопросы:
- возможно ли добиться того же результата без создания процедуры?
- не коряво ли всё написано?
...
Рейтинг: 0 / 0
17.03.2019, 21:18
    #39787435
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выбор по лучшему совпадению при переборе значений
Ууу... какая версия-то древнючая... ну а хотя бы максимальная длина этого поля, которое column1 - она сколько? И есть ли серьёзные основания полагать, что в будущем это значение не увеличится?
...
Рейтинг: 0 / 0
17.03.2019, 21:19
    #39787436
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выбор по лучшему совпадению при переборе значений
Dlemfeвозможно ли добиться того же результата без создания процедуры?возможно
...
Рейтинг: 0 / 0
18.03.2019, 03:52
    #39787497
Dlemfe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выбор по лучшему совпадению при переборе значений
AkinaУуу... какая версия-то древнючая... ну а хотя бы максимальная длина этого поля, которое column1 - она сколько? И есть ли серьёзные основания полагать, что в будущем это значение не увеличится?
Максимальная длина 20 и она точно не увеличится, значения будут колебаться в диапазоне 10-20
...
Рейтинг: 0 / 0
18.03.2019, 08:04
    #39787528
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выбор по лучшему совпадению при переборе значений
Ну тады навскидку будет что-то типа

Код: sql
1.
2.
3.
4.
SELECT mytable.column1
FROM mytable, (SELECT 1 num UNION SELECT 2 ... UNION SELECT 20) nums
WHERE SUBSTRING(mytable.column1 FOR num) = SUBSTRING(@parameter FOR num)
ORDER BY num DESC, mytable.column1 DESC LIMIT 1
...
Рейтинг: 0 / 0
18.03.2019, 13:54
    #39787764
Dlemfe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выбор по лучшему совпадению при переборе значений
AkinaНу тады навскидку будет что-то типа

Код: sql
1.
2.
3.
4.
SELECT mytable.column1
FROM mytable, (SELECT 1 num UNION SELECT 2 ... UNION SELECT 20) nums
WHERE SUBSTRING(mytable.column1 FOR num) = SUBSTRING(@parameter FOR num)
ORDER BY num DESC, mytable.column1 DESC LIMIT 1



Почему-то выдает ошибку:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SQL запрос: Документация

SELECT mytable.column1
FROM mytable, (SELECT 1 num UNION SELECT 2 ... UNION SELECT 20) nums
WHERE SUBSTRING(mytable.column1 FOR num) = SUBSTRING('AAA-123456785' FOR num)
ORDER BY num DESC, mytable.column1 DESC LIMIT 1

Ответ MySQL: Документация

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '... UNION SELECT 20) nums
WHERE SUBSTRING(mytable.column1 FOR num) = SUBSTRING(' at line 2
...
Рейтинг: 0 / 0
18.03.2019, 14:06
    #39787770
Dlemfe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выбор по лучшему совпадению при переборе значений
Если первый запрос лучше будет выполнять всё-таки процедурой, то добавил в неё входной параметр:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
DELIMITER $
DROP PROCEDURE IF EXISTS pr $
CREATE PROCEDURE pr(myparam VARCHAR(20))
BEGIN
    SET @i = 3;        
    WHILE @i >= 0 DO    
        IF (SELECT COUNT(*) FROM `mytable` WHERE `column1` LIKE CONCAT(myparam, '%') AND `column2` IS NOT NULL) > 0 THEN
            SELECT * FROM `mytable` WHERE `column1` LIKE CONCAT(myparam, '%') AND `column2` IS NOT NULL ORDER BY id DESC LIMIT 1;
            SET @i=0;
        END IF;        
        SET myparam= LEFT(myparam, CHARACTER_LENGTH(myparam)-1);
    	SET @i = @i- 1;        
    END WHILE;
END $
DELIMITER ;
CALL pr('AAA-123456785');




Второй запрос реализовал так:
Код: sql
1.
SELECT * FROM `mytable` WHERE `column1` LIKE CONCAT(LEFT('AAA-123456785', CHARACTER_LENGTH('AAA-123456785')-3), '%') AND `column2` IS NOT NULL ORDER BY `column1` DESC



Результат вроде как надо:
id column1 column22 AAA-123456781 Q3 AAA-123456711 W4 AAA-123456111 E
...
Рейтинг: 0 / 0
18.03.2019, 14:43
    #39787811
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выбор по лучшему совпадению при переборе значений
DlemfeПочему-то выдает ошибку:Я как-то предполагал, что у Вас хватит смекалки заменить многоточие на вполне очевидный промежуточный код...
...
Рейтинг: 0 / 0
18.03.2019, 18:27
    #39788015
Dlemfe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выбор по лучшему совпадению при переборе значений
AkinaDlemfeПочему-то выдает ошибку:Я как-то предполагал, что у Вас хватит смекалки заменить многоточие на вполне очевидный промежуточный код...
Я третий день знаком с sql, и впервые вижу то, что Вы использовали в коде, и пока даже не представляю, как это должно работать, можете подсказать?
...
Рейтинг: 0 / 0
19.03.2019, 07:44
    #39788149
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выбор по лучшему совпадению при переборе значений
...
Рейтинг: 0 / 0
19.03.2019, 14:05
    #39788432
Dlemfe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выбор по лучшему совпадению при переборе значений
Akina fiddle
Огромное спасибо! Работает как надо!
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос на выбор по лучшему совпадению при переборе значений / 16 сообщений из 16, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]