2009-06-09 5 views
8

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

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

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

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

ответ

11

Да, вы можете превратить каждое сравнение, такие как favourite_colour='Red' & с, в значение 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 следующего; -)

+0

Это довольно умно! –

+0

Это действительно очень хорошая идея. Было бы легко добавить к этому взвешивание, умножив один из результатов. –

+0

Это действительно отличное решение. Пара примечаний/вопросов: из того, что я могу сказать, SQL не разрешает псевдонимы столбцов (т. Е. Match_score) в предложениях WHERE. Кроме того, я не думаю, что SUM() ведет себя так, как предполагал ваш запрос (он не принимает несколько аргументов); Документация MySQL указывает, что SUM() является функцией агрегации GROUP BY. Удаление предложения WHERE и замена суммы на операторы сложения заставили функцию работать как шарм. –

0

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

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 

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

+0

Это не очень удобно или элегантно. –

+0

По сравнению с решением Алекса, я должен согласиться !. Но это все равно. – tekBlues

+0

Вот почему StackOverflow здесь :), чтобы найти лучшее решение. –

 Смежные вопросы

  • Нет связанных вопросов^_^