2

rethinkdb で次の SQL クエリを実装する際に問題が発生しました。user_count に基づいて、コミュニティで最も人気のある 5 つのチャネルを取得したいと考えています。

SELECT 
    channels.*, 
    COUNT(distinct channel_users.user_id) as user_count 
FROM channel_users 
LEFT JOIN channels ON 
    channels.id = channel_users.channel_id 
WHERE channels.community_id = "MY_COMMUNITY_ID" AND channels.type = 'public' 
GROUP BY channel_id 
ORDER BY user_count DESC 
LIMIT 5

これは、ReQL でこれまでに取得したものであり、チャネルのリストを提供するだけです。ここでさらにマップ/削減が必要だと思いますか?

r.db('my_db')
.table('channel_users')
.filter({ community_id : 'MY_community_id' })
.orderBy(r.desc('created_at'))
.eqJoin('channel_id', r.table('channels'))
.map(function(doc){ 
    return doc.merge(function(){ 
        return {
            'left' : null,
            'right': {'user_id': doc('left')('user_id')}
        }
    })
})
.zip()
.run(function(err, channels){
    console.log(err, channels);
    next();
});

テーブルのデザインは次のようになります。

channel_users

id | channel_id | community_id | role | user_id

チャンネル

id | community_id | name | user_id (creator)

どんな助けでも大歓迎です!ありがとう

4

1 に答える 1

0

これはあなたが望むことをしますか?

r.table('channels').filter(
  {community_id: 'MY_COMMUNITY_ID', type: 'public'}
).merge(function(channel) {
  return {user_count: r.table('channel_users').filter({channel_id: channel('id')}).count()};
}).orderBy(r.desc('user_count')).limit(5)

(にセカンダリ インデックスを作成する場合は、マージ内のgetAll代わりに を使用することで、これを高速化できることに注意してください。)filterchannel_id

于 2015-08-13T21:34:14.293 に答える