2011-03-03 112 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