@romicohen
WebDev

Как сформировать SQL (для MySQL) запрос по нахождению наиболее похожего профиля с множеством полей-флагов?

Есть таблица с профилями такого типа (упростил для наглядности):

id | name | flag1 | flag2 | flag3 | flag4
1 | user1 | 1 | 0 | 1 | 0
2 | user2 | 0 | 1 | 0 | 0
3 | user3 | 1 | 1 | 0 | 1
4 | user4 | 1 | 0 | 0 | 0

каким будет SQL-запрос, выбирающий для, например, user1, профили, с наибольшим числом совпадений, и ранжирующий их по этому признаку?

я почему-то уверен, что это типовая задача для БД))

просто я с ней раньше не сталкивался, и не хочу велосипеды придумывать

вдруг есть типовое идеальное решение и вы им поделитесь. т.е. чтобы это было наименее ресурсоемко из возможных.
  • Вопрос задан
  • 238 просмотров
Решения вопроса 1
@ComodoHacker
Велосипед, конечно же, уже придуман, и называется расстояние Хэмминга. Только ваши флаги нужно представить в виде битовой строки.

https://stackoverflow.com/questions/4777070/hammin...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
rozhnev
@rozhnev
Fullstack programmer, DBA, медленно, дорого
Можно предложить такое решение:
select * 
from users
order by ((flag1=1)*1 + (flag2=0)*1 + (flag3=1)*1 +(flag4=0)*1) desc
;


MariaDB fiddle

При сортировке используем сравнение параметров с желаемым профилем. При необходимости можно использовать различные коэффициенты для различных параметров
Ответ написан
Ваш ответ на вопрос

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

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