Как ранжироваться в MySQL, используя предложение WHERE и UNION ALL - PullRequest
1 голос
/ 03 августа 2010

Мне нужна помощь с запросом MySQL. Я пытаюсь ранжировать участников, используя предложение WHERE. Итак, я хотел бы оценивать новичков, промежуточных и опытных отдельно. Например:

Rank Name    Grade  Type
----------------------------------
1    Bob     98     Novice 
2    Jill    88     Novice 
3    Jimmy   42     Novice 
1    Mark    87     Intermediate 
2    Scott   85     Intermediate
3    Jim     77     Intermediate 
1    Jane    90     Advanced 
2    John    89     Advanced 
3    Josh    87     Advanced

Я пробовал:

SET @rank=0;

(SELECT @rank:=@rank+1 AS rank, name, grade, type FROM myTable WHERE type='novice' ORDER BY grade DESC)
UNION ALL
(SELECT @rank:=@rank+1 AS rank, name, grade, type FROM myTable WHERE type='intermediate' ORDER BY grade DESC)
UNION ALL
(SELECT @rank:=@rank+1 AS rank, name, grade, type FROM myTable WHERE type='experienced' ORDER BY grade DESC)

Полагаю, мне нужно как-то изменить ранг. Может быть, у меня есть другая проблема?

Ответы [ 2 ]

1 голос
/ 03 августа 2010

Использование:

SELECT t.name,
       t.grade,
       t.type,
       (SELECT COUNT(*)
          FROM YOUR_TABLE x
         WHERE x.type = t.type
           AND x.grade >= t.grade) AS rank
 FROM YOUR_TABLE t

Для обработки двух столбцов ранга используйте:

SELECT t.name,
       t.grade1,
       t.grade2,
       t.type,
       (SELECT COUNT(*)
          FROM YOUR_TABLE x
         WHERE x.type = t.type
           AND (x.grade1 + x.grade2) >= (t.grade1 + t.grade2)) AS rank
 FROM YOUR_TABLE t

Как бы я оценил новичка и промежуточных сотрудников вместе и продвинутого отдельно?

Использование:

SELECT y.*,
       (SELECT COUNT(*)
          FROM (SELECT *, 
                       CASE t.type
                         WHEN 'Advanced' THEN t.type
                         ELSE 'Non-Advanced'
                       END AS group_type
                  FROM YOUR_TABLE) x
         WHERE x.group_type = y.group_type
           AND (x.grade1 + x.grade2) >= (y.grade1 + y.grade2)) AS rank
  FROM (SELECT t.name,
               t.grade1,
               t.grade2,
               t.type,
               CASE t.type
                 WHEN 'Advanced' THEN t.type
                 ELSE 'Non-Advanced'
               END AS group_type
          FROM YOUR_TABLE t) y
0 голосов
/ 03 августа 2010

Вы можете сделать это за один раз, используя более сложное предложение ORDER BY.

SELECT @rank:=@rank+1 AS rank, name, grade, type 
FROM myTable 
ORDER BY 
    case type when 'novice'       then 1
              when 'intermediate' then 2 
              when 'experienced'  then 3 end,
    grade DESC
;

Чтобы сделать его еще лучше, вы можете использовать таблицу Type для хранения порядка сортировки, а затем добавить объединение, а затем просто упорядочить по type.sort_order, а затем по оценке, например.

SELECT @rank:=@rank+1 AS rank, name, grade, type 
FROM myTable 
JOIN Types ON myTable.type = Types.type 
ORDER BY Types.sort_order, grade DESC;
...