1

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

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

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. 什么是最节省资源的方法?我怀疑嵌套查询不是最好的方法,但老实说我不知道​​更好。
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 回答