Recuperando registros de MySQL com base em um conjunto variável de pontos de comparação

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

Pergunta

Vamos dizer que eu tenho uma tabela MySQL, people. Cada registro inclui uma variedade de propriedades, entre estes favourite_colour, country e age_group.

O que eu gostaria de fazer é recuperar registros desta tabela por sua semelhança com um conjunto de parâmetros específicos. Dada "Red", "Estados Unidos" e "18-25", por exemplo, os melhores resultados seriam os registros que correspondem todos os três. Estes seriam 100% partidas.

No entanto, eu também gostaria de recuperar os registros que correspondem a qualquer combinação de dois parâmetros (66% do fósforo), ou qualquer um parâmetro (33% match). Além disso, gostaria de ser capaz de definir pontos adicionais de comparação (por exemplo underwear_type, marital_status, etc.).

Existe uma solução relativamente eficiente para este problema?

Foi útil?

Solução

Sim, você pode transformar cada comparação, tais como favourite_colour='Red' & c, em um valor de 0 (false) ou 1 (true) - mysql irá fazê-lo implicitamente, mas para a generalidade você pode querer CAST( (favourite_colour='Red') AS INTEGER) & c; então, você SUM todos estes, ou seja.,

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

lhe dará aperfeiçoar jogos da primeira, 2-of-3 seguinte; fácil generalizar a ainda mais cheques -!)

Outras dicas

Para os três primeiros é fácil:

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

Eu não entendo os "pontos adicionais de comparação" parte, você pode explicar?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top