Как построить запрос с сортировкой по наилучшему вхождению?

Для пояснения сразу приведу пример:
Таблица:
CREATE TABLE `test` (
  `A` varchar(255) NOT NULL,
  `B` tinyint(1) NOT NULL,
  `C` int(11) NOT NULL,
  `D` int(11) NOT NULL
);


Данные:
INSERT INTO `test`(`A`, `B`, `C`, `D`) VALUES ("STR1",true,1,1);
INSERT INTO `test`(`A`, `B`, `C`, `D`) VALUES ("STR2",true,2,2);
INSERT INTO `test`(`A`, `B`, `C`, `D`) VALUES ("STR1",true,2,1);
INSERT INTO `test`(`A`, `B`, `C`, `D`) VALUES ("STR3",false,1,2);
INSERT INTO `test`(`A`, `B`, `C`, `D`) VALUES ("STR4",false,2,2);


Запрос имеет 4 переменных A = "STR1", B = true, C = 1, D = 1
В ответе все строки, сортированные в "похожести" на запрос.
"STR1",true,1,1    // полное совпадение
"STR1",true,2,1    // 3 совпадение
"STR2",true,2,2    // 1 совпадение
"STR3",false,1,2   // 1 совпадение
"STR4",false,2,2   // нет совпадений


Моя идея считать совпадения и сортировать по этому значению.
Написать хранимую процедуру сравнения compare(val1, val2), возвращающей число 0 или 1
и складывать их как то так...
compare(A, valA) + compare(B, valB) + compare(B, valB)  + compare(D, valD)  AS coincidence

Реально ли это сделать ? Есть ещё идеи ?
  • Вопрос задан
  • 83 просмотра
Пригласить эксперта
Ответы на вопрос 3
tsklab
@tsklab
Здесь отвечаю на вопросы.
Есть ещё идеи?
SOUNDEX (Transact-SQL).
И ещё DIFFERENCE (Transact-SQL).
Ответ написан
Комментировать
agsDevelopment
@agsDevelopment Автор вопроса
Пока получилось нечто подобное:
SELECT 
  `A`, 
  `B`, 
  `C`, 
  `D`, 
  IF (`A` = "STR1", 1, 0) +
  IF (`B` = true, 1, 0) + 
  IF (`C` = 1, 1, 0) + 
  IF (`D` = 1, 1, 0) 
  AS `CC` 
FROM `test` 
ORDER BY `CC` DESC
Ответ написан
Комментировать
@res2001
Developer, ex-admin
Преобразовывайте все 4 поля в строку, конкатенируйте полученные строки, по полученной строке стройте индекс.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы