1

下記の2つのネストされたクエリを使用して、自分のサイトにメンバーのリーダーボードを作成しようとしています。ネストされたクエリでMySQLのリーダーボード(メンバーのランク付けされたリスト)を作成する

最初のクエリは、メンバーのリストをつかむ:

SELECT member_id, username, screen_name FROM exp_members WHERE group_id IN (1,5) LIMIT 100 

2番目のクエリは、最初のクエリ内にネスト、およびメンバーのエントリがお気に入りに登録してきた回数をカウントグラブされています

SELECT COUNT(*) AS favorite_count 
    FROM qb_channel_titles, qb_channel_data, qb_matrix_data 
    WHERE qb_channel_titles.channel_id = '1' 
    AND qb_channel_titles.entry_id = qb_channel_data.entry_id 
    AND qb_channel_titles.entry_id = qb_matrix_data.entry_id 
    AND field_id = '13' 
    AND author_id = 'MEMBER_ID_FROM_FIRST_QUERY' 
    ORDER BY favorite_count DESC" 
} 

だから私は持っているコードは次のようである:

最初のGI内の2番目のクエリをネスト
[first query] 
    [second query] 
     ..output one row of the leaderboard.. 
    [/second query] 
[/first query] 

メンバーの適切なリストと、それぞれが受け取った投票の数が表示されますが、リストは2番目(内側)のクエリではなく最初の(外側の)クエリでソートされます。

つの質問:

  1. どのように私が降順にfavorite_countによってメンバーのリストを並べ替えるのですか?
  2. これを行う最も効率的な方法は何ですか?私は入れ子になっているクエリは最善の方法ではないと思っていますが、私は正直言ってそれほど良く分かりません。

答えて

1

このようなことをしようとしていますか?

SELECT 
    member_id, 
    username, 
    screen_name, 
    (SELECT COUNT(*) AS favorite_count 
     FROM qb_channel_titles, qb_channel_data, qb_matrix_data 
     WHERE qb_channel_titles.channel_id = '1' 
     AND qb_channel_titles.entry_id = qb_channel_data.entry_id 
     AND qb_channel_titles.entry_id = qb_matrix_data.entry_id 
     AND field_id = '13' 
     AND author_id = member_id 
     ORDER BY favorite_count DESC") as "Votes" 
FROM 
    exp_members 
WHERE 
    group_id IN (1,5) 
ORDER BY 
    (SELECT COUNT(*) AS favorite_count 
     FROM qb_channel_titles, qb_channel_data, qb_matrix_data 
     WHERE qb_channel_titles.channel_id = '1' 
     AND qb_channel_titles.entry_id = qb_channel_data.entry_id 
     AND qb_channel_titles.entry_id = qb_matrix_data.entry_id 
     AND field_id = '13' 
     AND author_id = member_id 
     ORDER BY favorite_count DESC") 
LIMIT 100 

また、ビューでこのクエリを入れて、ビュー(別のクエリのパフォーマンスワイズをネストの一種)を照会することができます。私はパフォーマンスの専門家ではありませんが、トリガーを使用して別のテーブルにfavorite_countを保持し、ユーザーのお気に入りのたびにトリガーが更新されると言います。他のテーブルはちょうどID|COUNTを持つことができます。これは、お気に入りの時間を増やしますが、リーダーボードをチェックする時間を減らすので、効率はリーダーボードのお気に入りまたは表示のためのユーザープロファイルに依存します...

+0

あなたは絶対にロックします。それは最高です。私はちょうど最終的な "LIMIT 100"の前にDESCを追加してそれを適切にソートしました。ありがとうございました!パフォーマンスに関するコメントも感謝しています。私は将来のためにトリガーを念頭に置いておきます。 –

関連する問題