2011-03-03 115 views
1

嗨,再次感謝您對這個問題的看法。比較字段和獲取百分比

我有一個遊客的MySQL表。他們可以將他們最喜愛的歌手添加到列表中。所以表看上去很簡單:

user_artist_favorites 
id 
user_id 
artistName 

比方說,夜光杯有4個最喜愛的歌手:

1. Michael Jackson 
2. Elvis Presley 
3. Ray Charles 
4. Stevie Wonder 

用戶測試了也4個最喜愛的歌手:

1. Michael Jackson 
2. Ray Charles 
3. Stevie Wonder 
4. Lady Gaga (sorry folks) 

我想現在做的是比較兩個用戶,並輸出類似的東西:Moonwalker &測試儀擁有75%的音樂品味。

如何開始?任何人都可以指點我正確的方向嗎?

在此先感謝您提供的任何幫助。

+0

75%是什麼?這取決於你對此的定義。百分比總是相對的。 – Czechnology

+0

那麼如果Tester和Moonwalker有相同的藝術家,這將是100%。現在他得到了3分,所以這兩個用戶在他們最喜歡的桌子上都有歌手總數的75%。或者不是你在問什麼? – moonwalker

+1

我想你想知道有多少歌手與總共百分比相同。收藏夾的數量總是4嗎?名稱是否完全相同(即,它們是否從下拉列表中選擇?)另外,您是否在一次比較兩個用戶之後? – Rasika

回答

4
Select T1.user_id 
    , Count(T2.user_id)/Count(T1.user_id) * 100.0 As PercentMatch 
From user_artist_favorites As T1 
    Left Join user_artist_favorites As T2 
     On T2.artistname = T1.artistname 
      And T2.user_id = 'Tester' 
Where T1.user_id = 'Moonwalker' 
Group By T1.user_id 
Union All 
Select T1.user_id 
    , Count(T2.user_id)/Count(T1.user_id) * 100.0 
From user_artist_favorites As T1 
    Left Join user_artist_favorites As T2 
     On T2.artistname = T1.artistname 
      And T2.user_id = 'Moonwalker' 
Where T1.user_id = 'Tester' 
Group By T1.user_id 

聯合所有查詢的第一部分返回測試人員像Moonwalker的百分比。第二個查詢返回Moonwalker與Tester相似的百分比。

+1

這隻會比較兩個用戶,但是想到完整的SQL解決方案是一個很好的開始。 – Rasika

+0

@Thomas:非常感謝解決方案!我還沒有嘗試過,但看起來很有希望。 – moonwalker

+1

@Rasika - 授予。這就是MS SQL Server的Cross Apply的便利之處。它將允許您選擇用戶對並在Union All查詢中引用這些用戶。不幸的是,MySQL沒有任何我知道的等價物。 – Thomas

1

您可以做的是讀取按兩位用戶的藝術家姓名排序的列表,並通過循環來計算匹配的歌手的數量。循環會有點複雜,因爲您需要檢查索引處的哪個列表按字母順序排列較大,並增加較低處的指針。

+0

的確聽起來很複雜。感謝你的回答,我會嘗試你的建議。 – moonwalker