我希望能够通过两列来订购用户:
这是我现在的查询
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.7
和followers_count
30%。但followers_count * 0.3
并未提供订购完整性。例如,某些用户拥有1到1千万个关注者,这会导致followers_count
过大而similar_follow
变得太小而不会对排序产生任何影响。
我考虑过followers_count/500
,其中500
是关注者的平均数量。然而,这仍然不适合订购。
我需要一种方法来均衡followers_count
和similar_follow
,因此乘以百分比(0.3
和0.7
)会对两个值产生影响。
我还看了https://medium.com/hacking-and-gonzo/how-reddit-ranking-algorithms-work-ef111e33d0d9#.wuz8j0f4w描述威尔逊得分间隔,但我不确定这是否是我的情况下的正确解决方案,因为我处理2个值(我可能是错的)。
谢谢。
答案 0 :(得分:2)
我通常在规范化范围较大的数据时使用LOG()。另外,为了重申@Abelisto,您尝试对每个列进行加权在您的实现中不起作用。将2加在一起应该有效。
例如:
...
ORDER BY LOG(followers_count) * 0.3 + LOG(similar_follow) * 0.7 DESC
答案 1 :(得分:1)
乘以指数(即similar_follow ^ 3.0
和followers_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
解决了问题:)