使用嵌套查询在MySQL中创建排行榜(排名的成员列表)

时间:2012-03-24 07:01:55

标签: mysql optimization expressionengine leaderboard nested-queries

我正在尝试使用下面的两个嵌套查询在我的网站上创建成员排行榜。

第一个查询获取成员列表:

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

第二个查询嵌套在第一个查询中,并获取成员条目被收藏次数的计数:

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]

将第二个查询嵌套在第一个查询中,可以得到正确的成员列表和每个收到的投票数,但列表是在第一个(外部)查询而不是第二个(内部)查询中排序的。 / p>

两个问题:

  1. 如何按favorite_count降序排列成员列表?
  2. 最有资源效率的方法是什么?我怀疑嵌套查询不是最好的方法,但老实说我不知道​​更好。

1 个答案:

答案 0 :(得分: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。这会增加时间,但会减少检查排行榜的时间,因此效率将取决于您的用户个人资料,以便收藏或查看排行榜......