2009-06-09 18 views
8

Załóżmy, że mam tabelę MySQL, people. Każdy rekord zawiera różne właściwości, spośród nich: favourite_colour, country i .Pobieranie rekordów MySQL w oparciu o zmienny zestaw punktów porównania

Co chcę zrobić, to pobrać rekordy z tej tabeli przez ich podobieństwo do zestawu określonych parametrów. Na przykład "Czerwony", "Stany Zjednoczone" i "18-25" najlepsze wyniki będą tymi rekordami, które pasują do wszystkich trzech. Będą to mecze w 100%.

Chciałbym jednak również pobrać rekordy pasujące do dowolnej kombinacji dwóch parametrów (dopasowanie 66%) lub dowolnego parametru (dopasowanie 33%). Ponadto chciałbym móc zdefiniować dodatkowe punkty porównania (np. underwear_type, marital_status itd.).

Czy istnieje relatywnie skuteczne rozwiązanie tego problemu?

Odpowiedz

11

Tak, można włączyć każdego porównania, takich jak favourite_colour='Red' & c, do wartości 0 (fałsz) lub 1 (true) - mysql zrobi to w sposób dorozumiany, ale dla ogólności warto CAST((favourite_colour='Red') AS INTEGER) & C; Następnie należy SUM wszystkie z nich, to znaczy

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 

daje doskonałe wyniki pierwszego, 2-of-3 następna; łatwe do uogólnienia na jeszcze więcej kontroli! -)

+0

To jest całkiem sprytne! –

+0

To naprawdę bardzo dobry pomysł. Łatwo byłoby dodać do tego również ważenie, mnożąc jeden z wyników. –

+0

To naprawdę świetne rozwiązanie. Kilka uwag/pytań: z tego, co mogę powiedzieć, SQL nie zezwala na aliasy kolumn (np. Match_score) w klauzulach WHERE. Ponadto, nie sądzę, że funkcja SUM() zachowuje się tak, jak sugeruje twoje zapytanie (nie akceptuje wielu argumentów); Dokumentacja MySQL wskazuje, że SUM() jest tylko funkcją agregacji GROUP BY. Usunięcie klauzuli WHERE i zastąpienie sumy operatorami dodającymi sprawiło, że funkcja działa jak urok. –

0

za trzy pierwsze jest proste:

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 

ja nie rozumiem „dodatkowych punktów porównania” część można wytłumaczyć?

+0

To nie jest zbyt użyteczne ani eleganckie. –

+0

W porównaniu z rozwiązaniem Alexa, muszę się zgodzić !. Ale i tak to działa. – tekBlues

+0

Dlatego StackOverflow jest tutaj :) aby znaleźć najlepsze rozwiązanie. –

Powiązane problemy