【问题标题】:Creating a leaderboard (ranked list of members) in MySQL with nested queries使用嵌套查询在 MySQL 中创建排行榜(成员排名列表)
【发布时间】:2012-03-24 07:01:55
【问题描述】:

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

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

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]

将第二个查询嵌套在第一个查询中会给我正确的成员列表和他们各自收到的票数,但该列表是按第一个(外部)查询而不是第二个(内部)查询排序的。

两个问题:

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

【问题讨论】:

    标签: mysql optimization expressionengine leaderboard nested-queries


    【解决方案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。这会增加收藏时的时间,但会减少查看排行榜的时间,因此效率将取决于您的用户个人资料收藏或查看排行榜...

    【讨论】:

    • 你绝对摇滚。那很完美。我刚刚在最终的“LIMIT 100”之前添加了一个 DESC 以使其正确排序。谢谢!我也很欣赏 cmets 的表现。我会记住未来的触发器。
    猜你喜欢
    • 2020-05-26
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多