2013-11-01 1 views
0

У меня есть следующий запрос mySQL, который я хочу дать отсортированным по вычисленному полю строкам с соответствующей строкой. Я использовал код OMG Ponies от here в качестве шаблона, но строки возвращаются некорректно (они нумеруются в ключевом (gemid) порядке без сортировки). Я знаю, что это связано с JOIN на GROUP BY, но я знаю, как это исправить. Заранее спасибо.MySQL получить позицию строки с ORDER BY неправильно нумеруем

SELECT g.gemid, sum_rating, @rownum := @rownum + 1 AS row_num FROM gems g 
    LEFT JOIN (SELECT gemid, SUM(rating) as sum_rating from gemrating GROUP BY gemid) rt ON g.gemid = rt.gemid 
    JOIN (SELECT @rownum := 0) Z 
    WHERE g.grade = '8' 
    ORDER BY sum_rating asc 

Вывод должен вернуться выглядеть как:

gemid sum_rating row_num 
------ ------------ ---------- 
2   10   1 
4   25   2 
1   40   3 
3   41   4 

Вместо этого он возвращается:

gemid sum_rating row_num 
------ ------------ ---------- 
2   10   2 
4   25   4 
1   40   1 
3   41   3 
+1

Каков ваш ожидаемый результат? Что именно вы хотите заказать? –

+0

Извините, если я не понял. Результат сортируется по порядку суммирования. row_num должен быть пронумерован от 1 до любого, отсортированного в этом порядке. Вместо этого он возвращается нумерованным в порядке естественного ключа и поэтому отображает row_num как 4,5,1,6 и т. Д. Я обновляю сообщение, чтобы лучше показать. – mseifert

ответ

0

Похоже, это работает. Я знал, что мне нужно сначала отсортировать записи, прежде чем их нумерация, а затем SELECT из упорядоченного списка.

SELECT g2.gemid, g2.sum_rating, @rownum := @rownum + 1 AS row_num FROM 

(SELECT g.gemid, rt.sum_rating, g.grade FROM gems g 
    LEFT JOIN (SELECT gemid, SUM(rating) as sum_rating from gemrating GROUP BY gemid) rt ON g.gemid = rt.gemid 
WHERE g.grade = '8' ) g2 

    JOIN (SELECT @rownum := 0) Z 
    WHERE g2.grade = '8' 
    ORDER BY sum_rating asc