2013-10-07 2 views
3

Пожалуйста, взгляните на следующий SQL Fiddle.Предельные группы с запросом

http://sqlfiddle.com/#!2/f7939/3

Вы увидите мой запрос о:

SELECT sub.entry_id, sum(jud.stage), sub.category_id, sub.member_group 
FROM exp_judging AS jud 
LEFT JOIN exp_submissions AS sub ON jud.rel_id = sub.id 
WHERE jud.rel_id = jud.rel_id 
GROUP BY jud.rel_id 
ORDER BY 3 ASC 
LIMIT 10 

Это добавляет все строки вместе, которые имеют один и тот же rel_id, а затем выводит их.

Мне нужно выводить только верхнее число x каждой категории, теперь давайте скажем 3 из каждой категории.

Так как пример, результаты моего SQL Fiddle будет:

Категория 1: (entry_id в порядке балла) 10, 11, 16

Категория 2: 13, 12, 14

Как я могу это достичь?

+0

насчет вступления ID 16 - не имеет ли она более высокой суммы 11 и 15? BTW, спасибо за предоставление Fiddle! – sgeddes

+0

@sgeddes Хороший улов, я изменил его на 16 :) – ccdavies

ответ

2

Хотя я уверен, что там должен быть чистым решением, вы могли бы ввести row number с помощью user defined variables для достижения этой цели:

SELECT * 
FROM (
    SELECT *, 
    @rn:=IF(@prevCat=category_id, @rn + 1,1) rn, 
    @prevCat:=category_id 
    FROM (
    SELECT sub.entry_id, 
     sum(jud.stage), 
     sub.member_group, 
     sub.category_id 
    FROM exp_judging AS jud 
     LEFT JOIN exp_submissions AS sub ON jud.rel_id = sub.id 
    GROUP BY jud.rel_id 
    ORDER BY sub.category_id, sum(jud.stage) DESC, sub.entry_id 
) T 
    JOIN (SELECT @rn:=0, @prevCat:=0) T2 
) T 
WHERE rn <= 3 
+0

Спасибо! Это немного сложнее, чем я привык, поэтому я буду изучать его в надежде научиться этому. – ccdavies

+0

@ccdavies - не беспокойтесь, рад, что я мог бы помочь! – sgeddes

Смежные вопросы