2015-04-17 2 views
0

Вот мое текущее заявление MySQL:Mysql Сброс переменной после выполнения каждой строки

SET @rownum := 0; 
SELECT school_id, 
     mb_no AS student_id, 
     xp, 
     @rownum := @rownum + 1 AS rank_school_position 
FROM users 
WHERE school_id IN (
     SELECT school_id 
     FROM users) 
ORDER BY xp DESC; 

Вот пример таблицы

CREATE TABLE `users` (
`school_id` INT(11) NOT NULL DEFAULT '0', 
`mb_no` INT(11) NOT NULL DEFAULT '0', 
`xp` INT(10) NOT NULL DEFAULT '0') 

и мои выборочные данные

INSERT INTO `d_copy` (`school_id`, `mb_no`, `xp`) VALUES 
(610, 1, 1190), 
(610, 2, 195), 
(611, 3, 0), 
(610, 4, 35), 
(610, 5, 160), 
(611, 6, 0), 
(610, 7, 175), 
(611, 8, 0), 
(610, 9, 95), 
(610, 10, 4770); 

Как сбросить назад @rownum до 0 на каждые SELECT school_id FROM users выполнено?

Мой ожидаемый результат будет как этот

enter image description here

+0

Пожалуйста, измените свой вопрос и предоставить образец данные и желаемые результаты. Объяснение не ясно. –

+0

@GordonLinoff [здесь] (http://stackoverflow.com/a/16715618/4020264) вы предупреждали об использовании переменных внутри запросов, неужели это все еще стоит? – 1010

+0

Это не то же самое, что @GordonLinoff ссылается на 'select @x, @x: = @x + 1'. первое '@ x' может иметь старое значение, или новое, его неопределенное. –

ответ

1

ход переменной инициализации в пункте from:

SELECT school_id, 
     mb_no AS student_id, 
     xp, 
     @rownum := @rownum + 1 AS rank_school_position 
FROM users, (SELECT @rownum := 0) q 
WHERE school_id IN (
     SELECT school_id 
     FROM users) 
ORDER BY xp DESC; 

редактировать

Я просто имел е piphany, и я думаю, что я понял, что вы хотите. Вот ваш ответ:

SELECT school_id, 
     mb_no AS student_id, 
     xp, 
     if(@prevschool = school_id, 
      @rownum := @rownum + 1, 
      case when @prevschool := school_id then @rownum := 1 end) AS rank 
FROM users 
WHERE school_id IN (
     SELECT school_id 
     FROM users) 
ORDER BY school_id asc, xp DESC; 

sqlfiddle

На другой вид - весь where пункт является излишним и может быть удалена. Кроме того, как указано в комментариях он не будет обрабатывать (странно) случай school_id из 0

SELECT school_id, 
     mb_no AS student_id, 
     xp, 
     if(@prevschool = school_id, 
      @rownum := @rownum + 1, 
      case when @prevschool := school_id then @rownum := 1 else @rownum := 1 end) AS rank_school_position 
FROM users 
ORDER BY school_id asc, xp DESC; 
+0

Все еще получил ошибку в синтаксисе mysql – Nere

+0

на SELECT SET @rownum: = 0 – Nere

+0

@ImranHamzah извините, исправлено это. этот запрос дает точный результат как ваш. –

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