За последние 24 часа нас посетили 26284 программиста и 1814 роботов. Сейчас ищут 1027 программистов ...

sort/rank

Тема в разделе "MySQL", создана пользователем uMnepaTop, 30 июл 2010.

  1. uMnepaTop

    uMnepaTop Активный пользователь

    С нами с:
    28 дек 2007
    Сообщения:
    58
    Симпатии:
    0
    Добрый вечер, I need help..
    Как вычислить номер строки (что-то типа ранга) с сортировкой по G_SCORE, если G_ID несколько, т.е..
    Код (Text):
    1. ID |NAME | G_ID | G_SCORE | G_RANK
    2. 1 | user1 | 3 | 3213 | 0
    3. 2 | user2 | 4 | 123 | 0
    4. 3 | user3 | 4 | 1312 | 0
    5. 4 | user4 | 3 | 2355 | 0
    6. 5 | user5 | 3 | 6765 | 0
    7. 6 | user6 | 3 | 76577 | 0
    чтобы получилось:

    Код (Text):
    1. 6 | user6 | 3 | 76577 | 1
    2. 5 | user5 | 3 | 6765 | 2
    3. 1 | user1 | 3 | 3213 | 3
    4. 4 | user4 | 3 | 2355 | 4
    5. 3 | user3 | 4 | 1312 | 1
    6. 2 | user2 | 4 | 123 | 2
    чтобы можно было выбрать G_RANK по ID

    не пойму никак :unsure:

    Запрос в БД такой:
    [sql]SELECT * FROM `tbl` WHERE `G_ID` = '1' ORDER BY `tbl`.`G_SCORE` DESC[/sql]
    Строчек с G_ID много (G_ID = 1, G_ID = 2 и т.д неопр. кол-во), различаются они по G_SCORE, вот и надо отсортировать G_SCORE по этому G_ID
    Вот такой запрос
    PHP:
    1. $i = 1;
    2. $mysql_query = mysql_query("SELECT * FROM `tbl` WHERE `G_ID` = '1' ORDER BY `tbl`.`G_SCORE` DESC");
    3. while ($row = mysql_fetch_assoc($mysql_query))
    4. {
    5.     $id = $row['id']; // unique
    6.     mysql_query("UPDATE `tbl` SET `G_RANK` = '{$i}' WHERE `id` = '{$id}'");
    7. $i++;
    8. }
    очень долгий.. Это всего лишь для одного G_ID.. Помогите пожалуйста, ничего не получается(
     
  2. runner

    runner Активный пользователь

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    uMnepaTop
    Для получения G_RANK=$rank для ID=$id нужен запрос:

    select * from tbl where ID='$id' ORDER BY G_SCORE DESC limit $rank,1

    Нужно учесть, что G_RANK будет начинаться с 0 - то что у вас сейчас 1.
    Например нужна запись с вашим G_RANK=5 и ID=$id
    $rank=5-1=4
    Требуемый запрос
    [SQL]select * from tbl where ID='$id' ORDER BY G_SCORE DESC limit 4,1[/SQL]
    [/b]
     
  3. uMnepaTop

    uMnepaTop Активный пользователь

    С нами с:
    28 дек 2007
    Сообщения:
    58
    Симпатии:
    0
    нет, постойте.. если
    PHP:
    1. $i = 1;
    2. $mysql_query = mysql_query("SELECT * FROM `tbl` WHERE `G_ID` = '3' ORDER BY `tbl`.`G_SCORE` DESC");
    3. while ($row = mysql_fetch_assoc($mysql_query))
    4. {
    5.      echo $i.' - '.$row['G_ID'].' - '.$row['NAME'].' - '.$row['G_SCORE'].'<br />';
    6. $i++;
    7. }
    Получится:
    1 - 3 - user6 - 76577
    2 - 3 - user5 - 6765
    3 - 3 - user1 - 3213
    4 - 3 - user4 - 2355

    PHP:
    1. $i = 1;
    2. $mysql_query = mysql_query("SELECT * FROM `tbl` WHERE `G_ID` = '4' ORDER BY `tbl`.`G_SCORE` DESC");
    3. while ($row = mysql_fetch_assoc($mysql_query))
    4. {
    5.      echo $i.' - '.$row['G_ID'].' - '.$row['NAME'].' - '.$row['G_SCORE'].'<br />';
    6. $i++;
    7. }
    Получится:
    1 - 4 - user3 - 1312
    2 - 4 - user2 - 123

    Вот эти $i выделенные жирным, мне надо в G_RANK занести, по их ID или NAME
    Т.е например, для user2 в G_RANK запишется 2 или для user1 в G_RANK запишется 3

    Зачем мне лимит? :shock:
     
  4. runner

    runner Активный пользователь

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    Прошу прошения,это я понял так, что вам известен G_ID и нужно получить юзера с заданным значением G_RANK
    Вычислить G_RANK можно так
    PHP:
    1.  
    2. $mysql_query="select * from tbl order by G_ID ,G_SCORE DESC";
    3. $group_id=0;
    4. while ($row = mysql_fetch_assoc($mysql_query))
    5. {
    6.      //если поменялся G_ID , то отсчет G_RANK начать с 1
    7.      if($group_id!= $row['G_ID'])
    8.      {
    9.            $rank=1;
    10.      }
    11.      $q="update tbl  set G_RANK='$rank' where id='{$row['ID']}' ";
    12.      mysql_query($q);
    13.       $rank++;  
    14. }
    15.  
     
  5. uMnepaTop

    uMnepaTop Активный пользователь

    С нами с:
    28 дек 2007
    Сообщения:
    58
    Симпатии:
    0
    пропущена строчечка
    PHP:
    1. mysql_query($mysql_query);
    и не работает.. он всем 1 приписывает..
     
  6. runner

    runner Активный пользователь

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    PHP:
    1.  
    2. $mysql_query="select * from tbl order by G_ID ,G_SCORE DESC";
    3.   $group_id=0;
    4.   while ($row = mysql_fetch_assoc($mysql_query))
    5. {
    6.       //если поменялся G_ID , то отсчет G_RANK начать с 1
    7.       if($group_id!= $row['G_ID'])
    8.       {
    9.             $rank=1;
    10.             $group_id= $row['G_ID'];
    11.       }
    12.       $q="update tbl  set G_RANK='$rank' where id='{$row['ID']}' ";
    13.       mysql_query($q);
    14.         $rank++;
    15.   }
    16.  
     
  7. uMnepaTop

    uMnepaTop Активный пользователь

    С нами с:
    28 дек 2007
    Сообщения:
    58
    Симпатии:
    0
    что-то похоже на нужное, но 504 ошибка меня напрягает, а он только первые полтора G_ID проапдейтил =/
     
  8. runner

    runner Активный пользователь

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    для оптимизации :
    [sql]
    $mysql_query="select G_ID,ID from tbl order by G_ID ,G_SCORE DESC";
    [/sql]
     
  9. uMnepaTop

    uMnepaTop Активный пользователь

    С нами с:
    28 дек 2007
    Сообщения:
    58
    Симпатии:
    0
    равносильно.. этих G_ID может быть несколько тысяч
    и у каждого G_ID, ID тоже по несколько тысяч..
     
  10. uMnepaTop

    uMnepaTop Активный пользователь

    С нами с:
    28 дек 2007
    Сообщения:
    58
    Симпатии:
    0
    может быть без UPDATE'a.. Если при выборке по ID как-то сразу посчитать, на каком он месте по G_SCORE DESC
     
  11. runner

    runner Активный пользователь

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    uMnepaTop
    Можете сказать:
    1) значения каких полей известно-ID ,NAME , G_ID , G_SCORE , G_RANK ?
    2) что нужно найти ?
     
  12. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
  13. uMnepaTop

    uMnepaTop Активный пользователь

    С нами с:
    28 дек 2007
    Сообщения:
    58
    Симпатии:
    0
    Все известно, кроме G_RANK - его и надо найти.. С сортировкой по G_SCORE DESC
     
  14. uMnepaTop

    uMnepaTop Активный пользователь

    С нами с:
    28 дек 2007
    Сообщения:
    58
    Симпатии:
    0
    Есть знающие люди?
     
  15. runner

    runner Активный пользователь

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    Я имел в виду, для каких записей нужно узнать G_RANK, т.е. какие из полей используются в предложении WHERE
     
  16. uMnepaTop

    uMnepaTop Активный пользователь

    С нами с:
    28 дек 2007
    Сообщения:
    58
    Симпатии:
    0
    Все, вопрос исчерпан, все пасибо за подсказки.. Тему можно закрывать.