Получение записей MySQL на основе переменного набора точек сравнения
-
13-09-2019 - |
Вопрос
Допустим, у меня есть таблица MySQL, people
.Каждая запись включает в себя множество свойств, среди которых favourite_colour
, country
, и age_group
.
Я хотел бы получить записи из этой таблицы по их сходству с набором определенных параметров.Например, учитывая «Красный», «Соединенные Штаты» и «18-25», лучшими результатами будут те записи, которые соответствуют всем трем.Это будет 100% совпадение.
Однако мне также хотелось бы получить записи, которые соответствуют любой комбинации двух параметров (совпадение 66 %) или любому одному параметру (совпадение 33 %).Более того, я хотел бы иметь возможность определить дополнительные точки сравнения (например, underwear_type
, marital_status
, и т. д.).
Есть ли относительно эффективное решение этой проблемы?
Решение
Да, вы можете включить каждое сравнение, например favourite_colour='Red'
&c, в значение 0 (ложь) или 1 (истина) - mysql сделает это неявно, но для общности вы можете захотетьCAST( (favourite_colour='Red') AS INTEGER)
&c;затем вы SUM
все это, т.е.
SELECT
userId,
SUM( (favourite_colour='Red'),
(country='US'),
(age_group='18-25') ) AS match_score
FROM people
WHERE match_score >= 2
ORDER BY match_score DESC
сначала даст вам идеальные совпадения, затем 2 из 3;легко обобщить на еще большее количество проверок!-)
Другие советы
Для троих первых легко:
select * from people
where
(case when color = 'Red' then 33 else 0 end +
case when age_group = '18-25' then 33 else 0 end +
case when country = 'United States' then 33 else 0 end)>=33
Я не понимаю часть «дополнительные точки сравнения», можете объяснить?