Получение записей MySQL на основе переменного набора точек сравнения

StackOverflow https://stackoverflow.com/questions/967985

Вопрос

Допустим, у меня есть таблица 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

Я не понимаю часть «дополнительные точки сравнения», можете объяснить?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top