按两个不同优先级的列排序 - Postgres

时间:2016-11-02 17:29:05

标签: postgresql search

我希望能够通过两列来订购用户:

  1. 他们拥有的粉丝数
  2. 我关注的相同以下用户的数量 - 相似性
  3. 这是我现在的查询

    SELECT COUNT(fSimilar.id) as similar_follow, COUNT(fCount.id) as followers_count, users.name FROM users 
    
      LEFT JOIN follows fSimilar ON fSimilar.user_id = users.id 
     AND fSimilar.following_id IN (
      SELECT following_id FROM follows WHERE user_id = 1    // 1 is my user id     
     )
     LEFT JOIN follows fCount ON fCount.following_id = users.id  
    WHERE users.name LIKE 'test%'
    GROUP BY users.name 
    ORDER BY followers_count * 0.3 + similar_follow * 0.7 DESC
    

    选择与我相同的人,并考虑他们的受欢迎程度(追随者数量)。这类似于Instagram搜索。

    我优先考虑similar_follow 70%或0.7followers_count 30%。但followers_count * 0.3并未提供订购完整性。例如,某些用户拥有1到1千万个关注者,这会导致followers_count过大而similar_follow变得太小而不会对排序产生任何影响。

    我考虑过followers_count/500,其中500是关注者的平均数量。然而,这仍然不适合订购。

    我需要一种方法来均衡followers_countsimilar_follow,因此乘以百分比(0.30.7)会对两个值产生影响。 我还看了https://medium.com/hacking-and-gonzo/how-reddit-ranking-algorithms-work-ef111e33d0d9#.wuz8j0f4w描述威尔逊得分间隔,但我不确定这是否是我的情况下的正确解决方案,因为我处理2个值(我可能是错的)。

    谢谢。

3 个答案:

答案 0 :(得分:2)

我通常在规范化范围较大的数据时使用LOG()。另外,为了重申@Abelisto,您尝试对每个列进行加权在您的实现中不起作用。将2加在一起应该有效。

例如:

...
ORDER BY LOG(followers_count) * 0.3 + LOG(similar_follow) * 0.7 DESC

答案 1 :(得分:1)

乘以指数(即similar_follow ^ 3.0followers_count ^ 1.5)怎么样? 参考:https://www.postgresql.org/docs/9.1/static/functions-math.html

答案 2 :(得分:1)

感谢@ForRealHomie,我实现了一个有效的查询。我仍然为其他人开放 建议:)

    SELECT 
users.id, users.name, 
fSimilar.count + fPopular.count as followCount 
FROM users

LEFT JOIN usernames ON usernames.user_id=users.id

LEFT JOIN (
SELECT  LOG(COUNT(user_id) + 1) * 0.7 as count, user_id 
FROM follows 
WHERE username_id IN (SELECT username_id FROM follows WHERE user_id=1)
GROUP BY user_id 
) fSimilar ON fSimilar.user_id = users.id 


LEFT JOIN (SELECT LOG(COUNT(username_id) + 1) * 0.3 as count, username_id 
FROM follows 
GROUP BY username_id 
) fPopular ON fPopular.username_id = usernames.id



  WHERE users.id IN (2, 3 ,4)


 ORDER BY followCount DESC

注意:LOG(COUNT(...) + 1),需要+ 1才能接受0生成的COUNT值,因为LOG不接受0所以+ 1解决了问题:)