选择X组中的最大N记录

时间:2011-09-29 19:26:10

标签: mysql grouping greatest-n-per-group

所以我一直在处理最大的每组标签下的所有问题,要么我不明白我正在阅读什么,或者到目前为止什么都不符合我的需求。 This link也提供了很多有用的信息,但仍然没有答案。

所以我有一个包含以下字段的表:

  • id(unique int)
  • user_id(int)
  • category(varchar)
  • 得分(int)
  • interest(int)

我认为我的问题偏离了常见的最大n组问题,因为我不需要每个组的最大N.我需要X组的最大N记录。

因此,我需要获得最高兴趣的X类别(简单,GROUP BY类别ORDER BY兴趣,LIMIT X)。然后我需要获得每个类别中得分最高的N条记录。

我的查询如何查找这样的内容?

很抱歉,如果这真的是每个其他每个最大n组问题的重复,我只是不明白它们是如何工作的。如果是这样,请随意关闭。

更新

Per @ tehshrike的推文,这里有更多的信息。

真正发生的事情是我的用户拥有许多不同interest的{​​{1}}。我想生成原始用户categories所在scorecategories位置最高的用户列表。

所以我正在寻找的一件事是:

用户1最多interested的4 scorecategories位置最高的15位用户。


对于特定用户ID ,查找前X个类别(对该特定用户感兴趣最高)和那些(X类别)查找前N个用户(这些类别的得分最高)。

2 个答案:

答案 0 :(得分:1)

SELECT catX.category
       catX.interest
       t1.user_id
       t1.score
FROM 
    ( SELECT category 
           , interest 
      FROM tableX 
      WHERE user_id = @user_id_we_are_interested_in     --- specific user 
      ORDER BY interest DESC
      LIMIT @X                         --- top @X categories per specific user 
    ) AS catX 
  JOIN 
    tableX AS t1 
      ON t1.category = catX.category 
  LEFT JOIN 
    tableX AS t2 
      ON  t2.category = t1.category 
      AND t2.score > t1.score 
  GROUP BY t1.category
         , t1.user_id
  HAVING COUNT(t2.score) < @N                      --- top @N users per category 
  ORDER BY catX.interest DESC 
         , t1.score DESC 

答案 1 :(得分:0)

您可能想要编写groupwise-max查询,然后通过JOIN加入以下内容来限制它:

JOIN
(
  SELECT category
  FROM your_table
  ORDER BY interest
  LIMIT 10
) AS just_get_these_categories ON just_get_these_categories.category = your_table.category

(假设该类别是您表中的候选键)

编辑:基于进一步的问题,它看起来像你想要的是不可能的。 (见:chatlog