2013-11-16 4 views
1

В нижнем sql я пытаюсь увеличить ранг на основе столбца perCent. Дело здесь в том, что ранг должен оставаться тем же, когда подобный счет найден.Приращение MySql или нет на основе предыдущего значения

select id, perCent, 
     @curRank := if(parent = @prevParent and perCent != @prevPerCent , @curRank + 1, 1) AS rank, 

     @prevParent := parent, @prevPerCent := perCent 
from (
    select child.id, child.perCent, child.parent 
    from likesd parent 
    join likesd child 
     on parent.id = child.parent 
    where parent.type = 3 
    order by parent.id, child.perCent desc) x 
cross join (SELECT @curRank := 0, @prevParent := null, @prevPerCent := null) r 

Например: 50 ранг 1, 30 ранг 2, 30 снова ранг 2, 20 является рангом 3. Идея заключается в том, чтобы не увеличивать, когда подобный ранг найден.

Как это сделать? Как я могу сказать MySql в инструкции if, чтобы не увеличивать его?

Основная логика

if parent = @prevParent, if perCent = @prevPerCent 
// Dont increment 
else 
increment 

я застрял с этой частью в MySql. Вы можете помочь?

Главная Таблица

"id" "type" "parent" "country" "votes" "perCent" 
"24" "1"  "1"   "US"  "35" "0" 
"25" "3"  "24"  "US"  "35" "0" 
"26" "10" "25"  "US"  "15" "50.00" 
"27" "10" "25"  "US"  "10" "33.33" 
"28" "10" "25"  "US"  "10" "33.33" 

"29" "1"  "1"   "US"  "50" "0" 
"30" "3"  "29"  "US"  "50" "0" 
"31" "10" "30"  "US"  "20" "40.00" 
"32" "10" "30"  "US"  "15" "25.00" 
"33" "10" "30"  "US"  "15" "35.00" 

Ожидаемые результаты:

"id" "perCent" "rank" 
"26" "50.00" "1" 
"27" "33.33" "2" 
"28" "33.33" "2" // No increment in rank if the perCent is same as above 

"31" "40.00" "1" // Continious incrementing here. PerCents differ. 
"33" "35.00" "2" 
"32" "25.00" "3" 

Некоторые больше усилий, которые не работают (! Тьфу Сдаюсь)

select id, perCent, 
     @curRank := if(parent = @prevParent, TRUE, FALSE) AS rank, 

     @curCent := if(perCent = @prevCent, FALSE, TRUE) AS cent, 

     @curRank := if(@curRank and @curCent, @curRank + 1,'No Inc') AS k, 

     @prevParent := parent, @prevCent := perCent 
from (
    select child.id, child.perCent, child.parent 
    from likesd parent 
    join likesd child 
     on parent.id = child.parent 
    where parent.type = 3 
    order by parent.id, child.perCent desc) x 
cross join (SELECT @curRank := 0, @prevParent := null, @prevCent := null) r 

ответ

1

Попробуйте это: http://sqlfiddle.com/#!2/ac996/7

select id, perCent, rank 
from 
(
    select id, perCent 
    , @curRank := 
     case 
      when @prevParent = parent then 
       case 
        --if parents are the same and values are the same, rank is the same 
        when @prevCent = perCent then @curRank 
        --if same parents but different values, increment the rank 
        else @curRank + 1 
       end 
      --if parents are different, reset the rank 
      else 1 
     end rank 
    , @prevParent := parent 
    , @prevCent := perCent 
    from 
    (
     select child.id, child.perCent, child.parent 
     from likesd parent 
     inner join likesd child 
      on child.parent = parent.id 
     where parent.type = 3 
     order by parent.id 
     , child.perCent desc 
    ) x 
    cross join (SELECT @curRank := 0, @prevParent := null, @prevCent := null) r 
) y 
+0

скрипкой работает хорошо, но вы знаете, почему я получаю '/ * SQL Error (1054): Неизвестный столбец«ранг»в«списке поля»* /', когда я испытываю на мой локальная машина? В скрипке тоже нет, но это хорошо работает. – jmenezes

+0

Хорошо. Все работает красиво. Я скопировал код со скрипки. Это работает отлично. Спасибо за помощь в этом. Хотел бы я закодировать, как ты. Когда я выясню, как это сделать, я награду за это. – jmenezes

+0

Ах, извините, я обернул внутренний SQL во внешнем SQL и забыл добавить имя столбца во внутренний SQL в указанной выше версии - теперь добавлен. Честно говоря, вы сделали все умные вещи выше - я просто немного подстроил/поменял '' '' '' '' '' '' '' заявления'. Удачи вам в этом. – JohnLBevan

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