Извлечение записей MySQL на основе переменного набора точек сравнения - PullRequest
8 голосов
/ 09 июня 2009

Допустим, у меня есть таблица MySQL, people. Каждая запись содержит множество свойств, среди которых favourite_colour, country и age_group.

Что я хотел бы сделать, так это извлечь записи из этой таблицы по их сходству с набором определенных параметров. Например, с учетом "Red", "United States" и "18-25" наилучшими результатами будут те записи, которые соответствуют всем трем. Это будет 100% совпадений.

Однако я также хотел бы получить записи, которые соответствуют любой комбинации двух параметров (совпадение 66%) или любого одного параметра (совпадение 33%). Более того, я хотел бы иметь возможность определить дополнительные точки сравнения (например, underwear_type, marital_status и т. Д.).

Есть ли относительно эффективное решение этой проблемы?

Ответы [ 2 ]

11 голосов
/ 09 июня 2009

Да, вы можете превратить каждое сравнение, например favourite_colour='Red' & c, в значение 0 (false) или 1 (true) - 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 затем; Легко обобщить еще больше проверок! -)

0 голосов
/ 09 июня 2009

Для трех первых легко:

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

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

...