2009-06-09 19 views
8

Bir MySQL tablomuz var, people. Her kayıt, bu favourite_colour, country ve age_group arasında çeşitli özellikler içerir.Karşılaştırma noktalarının bir değişken kümesini temel alarak MySQL kayıtlarını alma

Yapmak istediğim, bu tablodaki kayıtları belirli bir dizi parametreyle benzerliklerine göre almaktır. Örneğin, "Kırmızı", "Amerika Birleşik Devletleri" ve "18-25" değerleri verildiğinde, en iyi sonuçlar, her üç ile eşleşen kayıtlar olacaktır. Bunlar% 100 maç olur. Bununla birlikte, iki parametrenin (% 66 eşleşme) veya herhangi bir parametrenin (% 33 eşleşmesi) herhangi bir birleşimi ile eşleşen kayıtları almak istiyorum. Ayrıca, ilave karşılaştırma noktaları tanımlamak istiyorum (örneğin, underwear_type, marital_status, vb.).

Bu problem için nispeten verimli bir çözüm var mı? Üç İlk İçin

cevap

11

Evet, 0 (yanlış) veya 1 (doğru) bir değere her karşılaştırma gibi favourite_colour='Red' & c, açabilirsiniz - MySQL örtük yapacak, ancak genelliği için size CAST((favourite_colour='Red') AS INTEGER) & c isteyebilirsiniz; Sonra, sen SUM Bunların hepsi, yani

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 

ilk size mükemmel eşleşmeleri verecektir 2-of-3 sonraki; Daha fazla kontrol için genellenmesi kolay! -)

+0

Bu oldukça zekice! –

+0

Bu gerçekten çok iyi bir fikir. Sonuçlardan birini çarparak buna da ağırlık eklemek çok kolay olurdu. –

+0

Bu gerçekten harika bir çözüm. Birkaç not/soru: Anlatabildiğim kadarıyla SQL, WHERE maddelerinde sütun takma adlarına (örn. Match_score) izin vermiyor. Ayrıca, SUM() 'ın sorgunuzun önereceği gibi davrandığını sanmıyorum (çoklu argümanları kabul etmiyor); MySQL'in belgeleri SUM(), yalnızca GROUP BY toplama işlevidir. WHERE yan tümcesini kaldırmak ve toplama işleçleri ile toplamı değiştirmek işlevi bir çekicilik gibi çalışır. –

0

kolaydır:

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 

Sana açıklayabilirim, bölüm "karşılaştırma ek puan" anlamıyorum?

+0

Bu çok kullanışlı veya zarif değil. –

+0

Alex'in çözümüyle karşılaştırıldığında, katılıyorum! Ama yine de çalışır. – tekBlues

+0

Bu yüzden StackOverflow burada :) en iyi çözümü bulmak için. –

İlgili konular