2016-11-02 7 views
1

は、私は2つの列でユーザーを注文することができるようにしたい:信者の注文のPostgres

  1. ナンバー彼らが持っている私は、次の午前同じ次のユーザーの
  2. 数 - について類似

は、ここでこれは人々THAを選択し、今

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の検索に似ています。


Iは、30%、70%又は0.7によってsimilar_follow、及びfollowers_countを優先。しかし、followers_count * 0.3は注文の完全性を提供しません。たとえば、1〜1,000万人のフォロワーを持つユーザーがいると、followers_countが大きすぎるため、similar_followが小さすぎて注文に影響を与えません。

followers_count/500ここで、500は平均フォロワー数です。しかし、これはまだ注文のためにうまくいきません。


Iはfollowers_countsimilar_followを等しくする方法が必要なので、パーセンテージ(0.30.7)による乗算は、両方の値の差分を行います。 またhttps://medium.com/hacking-and-gonzo/how-reddit-ranking-algorithms-work-ef111e33d0d9#.wuz8j0f4wを見て、ウィルソンスコア間隔を見ていますが、私が2つの値(私は間違っているかもしれません)を扱うので、これが私の場合の正しい解決策であるかどうかはわかりません。

ありがとうございます。

+0

クエリで 'FROM ...'句が見つかりません。 – wildplasser

+0

'ORDER BY followers_count * 0.3 DESC、similar_follow * 0.7 DESC'は' ORDER BY followers_count DESC、similar_follow DESC'と同じです。この場合の係数は順序を変更しないためです。おそらく、あなたは 'ORDER BY followers_count * 0.3 + similar_follow * 0.7 DESC'を望んでいますか? – Abelisto

+0

@wildplasser申し訳ありません私の悪い –

答えて

2

大規模なデータを正規化するときは、通常はLOG()を使用します。また、@Abelistoを繰り返すために、あなたの実装では各列を重み付けすることはできません。 2を一緒に追加すると効果があります。例えば

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

ありがとう、そうでなければより良いテクニックが得られます。 –

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 

NB:LOG(COUNT(...) + 1)LOG0そう+ 1修正問題を受け入れていないので+ 1は、COUNTによって生成され0値を受け入れるために必要とされています。 )