1

以下の 2 つのネストされたクエリを使用して、サイトにメンバーのリーダーボードを作成しようとしています。

最初のクエリは、メンバーのリストを取得します。

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"
}

だから私が持っているコードは次のようなものです:

[first query]
   [second query]
      ..output one row of the leaderboard..
   [/second query]
[/first query]

最初のクエリ内に 2 番目のクエリをネストすると、メンバーの適切なリストとそれぞれが受け取った投票数が得られますが、リストは 2 番目の (内部) クエリではなく、最初の (外部) クエリで並べ替えられます。

2 つの質問:

  1. favorite_countメンバーのリストを降順に並べ替えるにはどうすればよいですか?
  2. これを行うための最もリソース効率の良い方法は何ですか? ネストされたクエリは最善の方法ではないと思いますが、正直なところ、それ以上のことはわかりません。
4

1 に答える 1

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. これにより、お気に入りに登録する時間が増えますが、リーダーボードを確認する時間が短縮されます。そのため、効率は、お気に入りに登録したりリーダーボードを表示したりするためのユーザー プロファイルに依存します...

于 2012-03-24T13:19:55.247 に答える