Выбор лучших N записей в X группах - PullRequest
1 голос
/ 29 сентября 2011

Итак, я перебрал все вопросы по тегу "наибольшие числа на группу", и либо я не понимаю, что я читаю, либо ничего не соответствует моим потребностям. Эта ссылка также предоставила много полезной информации, но ответа до сих пор нет.

Итак, у меня есть таблица со следующими полями:

  • id (уникальный int)
  • user_id (int)
  • категория (варчар)
  • оценка (int)
  • проценты (int)

Я полагаю, что моя проблема отклоняется от общего вопроса о наибольшем n-на-группе, поскольку мне не нужен самый большой N для в каждой группе. Мне нужны самые большие N записей для X групп.

Итак, мне нужно получить X категорий с наибольшим интересом (простой, категория GROUP BY, ORDER BY интереса, LIMIT X). И тогда мне нужно получить N записей с наибольшим количеством баллов для каждой из этих категорий.

Как мой запрос будет выглядеть примерно так?

Извините, если это действительно дубликат каждого другого вопроса, посвященного величайшим группам, и я просто не понимаю, как они работают. Не стесняйтесь закрыть это, если так.

Обновление:

По подталкиванию @ tehshrike, вот немного больше информации.

На самом деле происходит то, что у моего пользователя есть interest во множестве разных categories. Я хотел бы создать список пользователей с наибольшим значением score в categories, что у исходного пользователя interested в.

Итак, одна из возможных вещей, которую я ищу, это:

15 пользователей с самым высоким score в 4 categories, что пользователь 1 является самым interested в.


Для определенного user_id найдите Лучшие X категорий (с наибольшим интересом для этого конкретного пользователя), а для этих (X категорий) найдите Лучшие N пользователей (с наибольшим количеством баллов для этих категорий).

Ответы [ 2 ]

1 голос
/ 30 сентября 2011
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 
0 голосов
/ 29 сентября 2011

Возможно, вы захотите написать свой запрос groupwise-max, а затем ограничить его, присоединившись к чему-то вроде этого:

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 )

...