Обновление MySQL, но также не обновление - PullRequest
2 голосов
/ 13 января 2010

Я пишу на MySQL / PHP, но у меня возникла проблема, я не могу разобраться. Этот один скрипт PHP содержит два оператора SQL. Я пытаюсь обновить таблицу спортивных лиг (таблицу SQL с именем tblrank, которая содержит много таблиц лиг, разделенных TableID) и указать, была ли команда повышена или понижена с момента последнего обновления. Этот первый фрагмент кода немного неуклюж и, возможно, мог бы быть написан лучше (я мог бы сделать это примерно в 6 строках в MSSQL), он работает, подсчитывая количество команд, которые ранжируются ниже его, а затем добавляя одну. Кажется, это работает ... вроде, как я объясню позже.

update tblrank AS r
        set Rank = 1 + (select count(*) from 
                             (select r2.teamID
                              from tblrank r2
                                   inner join tblrank r3
                              where r3.TableID = r2.TableID and r3.TableID = $tableid
                              and (r3.Points > r2.Points
                                  or (r3.Points = r2.Points and r3.TieBreaker > r2.TieBreaker))) as duh
                        where duh.teamID = r.teamID 
                        and duh.TableID = r.TableID 
                        and r.TableID = $tableid

Затем выполняется этот бит кода, чтобы выбрать изображение для отображения.

update tblrank
set image = case when Rank < LastRank then 'up.png'
        when Rank > LastRank then 'down.png'
        else 'nomove.png' end
where TableID = $tableid

Теперь, если я запускаю это для $ tableid = 1, все работает просто отлично. Но если я запускаю его для $ tableid = 2, тогда все ранги во всем tblRank устанавливаются на 1. (Перед запуском его для $ tableid = 2 все ранги равны 1, за исключением записей, где TableID = 1). Это явно не то, что я хочу.

Оба оператора находятся внутри условия if (mysql_query ($ sql)), поэтому я могу проверить, выполнялись они или нет.

Я использую MS SQL намного больше, чем mySQL, поэтому я не эксперт - может кто-нибудь помочь мне с этим, когда я сбит с толку! Я проверил, что оба куска кода выполняются. Между ними нет никакого другого SQL.

Ответы [ 2 ]

0 голосов
/ 14 января 2010

Вот как бы я это сделал. Сначала инициализируйте все значения Rank до нуля.

UPDATE tblrank SET Rank = 0;

UPDATE tblrank r1 JOIN tblrank r2 ON r1.TableID = r2.TableID
SET r1.Rank = r1.Rank + 1
WHERE r1.Points > r2.Points 
  OR (r1.Points = r2.Points AND r1.TieBreaker > r2.TieBreaker)

Объединение естественным образом сопоставляет каждую строку r1 с набором строк r2 с той же таблицей и командой и меньшим количеством баллов. Затем он увеличивает Rank на 1 для каждой из этих совпадающих строк.

0 голосов
/ 14 января 2010

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

create temporary table rankcount (TableID int, UserID int)");
   insert into rankcount (TableID, UserID)
            select r2.TableID, r2.UserID
                from tblRank r2
                                inner join tblRank r3
            where r3.TableID = r2.TableID and r3.TableID = $tableid
            and (r3.Points > r2.Points
                   or (r3.Points = r2.Points and r3.TieBreakerOne > r2.TieBreakerOne))

Тогда это работает ...

update userEntryTableRank r
        set Rank = 1 + (select count(*) from rankcount rc
                        where rc.UserID = r.UserID and rc.TableID = r.TableID)
        where r.TableID = $tableid

:)

...