2009-06-09 24 views
8

Disons que j'ai une table MySQL, people. Chaque enregistrement comprend une variété de propriétés, parmi lesquelles favourite_colour, country et age_group.Récupération des enregistrements MySQL en fonction d'un ensemble de points de comparaison variable

Ce que je voudrais faire est de récupérer des enregistrements de cette table par leur similitude avec un ensemble de paramètres spécifiques. Étant donné «Red», «United States» et «18-25», par exemple, les meilleurs résultats seraient ceux qui correspondent aux trois. Ce seraient des correspondances à 100%.

Cependant, j'aimerais également récupérer les enregistrements qui correspondent à n'importe quelle combinaison de deux paramètres (correspondance de 66%) ou d'un paramètre quelconque (correspondance de 33%). De plus, j'aimerais pouvoir définir des points de comparaison supplémentaires (par exemple underwear_type, marital_status, etc.).

Y a-t-il une solution relativement efficace à ce problème?

Répondre

11

Oui, vous pouvez activer chaque comparaison, comme favourite_colour='Red' & c, en une valeur de 0 (faux) ou 1 (true) - MySQL fera implicitement, mais pour la généralité, vous voudrez peut-être CAST((favourite_colour='Red') AS INTEGER) & c; puis, vous SUM tous ces domaines, à savoir,

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 

vous donnera les matchs parfaits premier, 2-de-3 suivant; facile à généraliser pour encore plus de contrôles! -)

+0

C'est assez intelligent! –

+0

C'est en effet une très bonne idée. Il serait facile d'ajouter une pondération à cela en multipliant l'un des résultats. –

+0

C'est en effet une excellente solution. Quelques notes/questions: d'après ce que je peux dire, SQL n'autorise pas les alias de colonnes (ie match_score) dans les clauses WHERE. En outre, je ne pense pas que SUM() se comporte comme votre requête le suggère (il n'accepte pas plusieurs arguments); La documentation de MySQL indique que SUM() est une fonction d'agrégation GROUP BY uniquement. En supprimant la clause WHERE et en remplaçant la somme par des opérateurs d'addition, la fonction fonctionne comme un charme. –

0

Pour les trois premiers est facile:

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 

Je ne comprends pas la partie « des points supplémentaires de comparaison », pouvez-vous expliquer?

+0

Ce n'est pas très utilisable ou élégant. –

+0

Comparé à la solution d'Alex, je suis d'accord! Mais ça marche quand même. – tekBlues

+0

Voilà pourquoi StackOverflow est là :) pour trouver la meilleure solution. –