[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: sort/rank..
uMnepaTop
I need help..
Как вычислить номер строки (что-то типа ранга) с сортировкой по G_SCORE, если G_ID несколько, т.е..
ID |NAME | G_ID | G_SCORE | G_RANK
1 | user1 | 3 | 3213 | 0
2 | user2 | 4 | 123 | 0
3 | user3 | 4 | 1312 | 0
4 | user4 | 3 | 2355 | 0
5 | user5 | 3 | 6765 | 0
6 | user6 | 3 | 76577 | 0


чтобы получилось:

6 | user6 | 3 | 76577 | 1
5 | user5 | 3 | 6765 | 2
1 | user1 | 3 | 3213 | 3
4 | user4 | 3 | 2355 | 4
3 | user3 | 4 | 1312 | 1
2 | user2 | 4 | 123 | 2


чтобы можно было выбрать G_RANK по ID

не пойму никак unsure.gif



Спустя 3 минуты, 55 секунд (30.07.2010 - 15:44) Adil написал(а):
SORT BY G_SCORE DESC 
?

тьфу ты: order

Спустя 28 секунд (30.07.2010 - 15:44) Michael написал(а):
Цитата
Как вычислить номер строки

вот это не понял.

Тебе запрос SELECT нужен с сортировкой по двум столбцам?

Спустя 30 секунд (30.07.2010 - 15:45) uMnepaTop написал(а):
Цитата
Тебе запрос SELECT нужен с сортировкой по двум столбцам?
Наверное, мне не сообразить sad.gif

Спустя 3 минуты, 9 секунд (30.07.2010 - 15:48) Michael написал(а):
select * from mytable order by G_ID ASC, G_SCORE DESC

- отсортирует тебе табличку как надо.

Спустя 11 минут, 53 секунды (30.07.2010 - 16:00) uMnepaTop написал(а):
Не.. Надо по каждому G_ID, а не общий G_RANK по всей таблице blink.gif
Например, есть 100 записей, G_ID у них одинаковый, сортируем G_SCORE
Потом берем следующий G_ID со 130 записями, опять сортируем по G_SCORE
Чтобы как бы у каждого G_ID свой ORDER `G_SCORE` DESC ph34r.gif

Спустя 14 минут, 59 секунд (30.07.2010 - 16:15) uMnepaTop написал(а):
Я первый пост отредактировал, гляньте вторую табличку.. А точнее на G_RANK unsure.gif

Спустя 6 часов, 14 минут, 39 секунд (30.07.2010 - 22:30) uMnepaTop написал(а):
Запрос в БД такой:
SELECT * FROM `tbl` WHERE `G_ID` = '1' ORDER BY `tbl`.`G_SCORE` DESC

Строчек с G_ID много (G_ID = 1, G_ID = 2 и т.д неопр. кол-во), различаются они по G_SCORE, вот и надо отсортировать G_SCORE по этому G_ID
А этих G_ID тоже много.. unsure.gif
Вот такой запрос
$i = 1;
$mysql_query = mysql_query("SELECT * FROM `tbl` WHERE `G_ID` = '1' ORDER BY `tbl`.`G_SCORE` DESC");
while ($row = mysql_fetch_assoc($mysql_query))
{
$id = $row['id']; // unique
mysql_query("UPDATE `tbl` SET `G_RANK` = '{$i}' WHERE `id` = '{$id}'");
$i++;
}

очень долгий.. Это всего лишь для одного G_ID.. blink.gif

Спустя 13 часов, 43 минуты, 3 секунды (31.07.2010 - 12:13) SlavaFr написал(а):
a зачем для update сортировать то?
и для чего собственно селект?
и что мешает условия для update прямо в update прописать?

Спустя 36 минут, 37 секунд (31.07.2010 - 12:49) uMnepaTop написал(а):
т.е
update(lalala(select));
?

Спустя 7 часов, 23 минуты, 37 секунд (31.07.2010 - 20:13) SlavaFr написал(а):
нет просто сразу в Updadt пиши WHERE `G_ID`='1' .

Спустя 10 минут, 29 секунд (31.07.2010 - 20:23) Guest написал(а):
ну так G_ID много.. И номера у них с пропусками: 1, (2 вообще нет), 3, 4 и т.д..

Спустя 15 часов, 31 минута, 1 секунда (1.08.2010 - 11:54) uMnepaTop написал(а):
есть знающие люди? unsure.gif

Спустя 3 часа, 16 минут, 2 секунды (1.08.2010 - 15:10) SlavaFr написал(а):
понял.
a что если так поэксперементировать?
select ID ,NAME , G_ID,G_SCORE ,if(@gid is null or @gid<>G_ID,@c:=1,@c:= @c+1 ) as rank,@gid:=G_ID from mytable order by G_ID ASC, G_SCORE DESC

Спустя 2 часа, 40 минут, 8 секунд (1.08.2010 - 17:50) Guest написал(а):
афигеть huh.gif
только (as rank) у всех равен 1..

Спустя 52 секунды (1.08.2010 - 17:51) uMnepaTop написал(а):
тьфу, опять забыл залогиниться ph34r.gif
as rank равен 1 если сразу выводить, а update - 504 Gateway Time-out wacko.gif

Спустя 2 часа, 58 минут (1.08.2010 - 20:49) SlavaFr написал(а):
я специально неполинился и решил накаляканое мной проверить.
работает, как хотелось.

CREATE TABLE `tbl` (
`id` int AUTO_INCREMENT NOT NULL,
`name` varchar(20),
`g_id` int NOT NULL,
`g_score` int NOT NULL,
/* Schlьssel */
PRIMARY KEY (`id`)
)
ENGINE = MyISAM;

insert into tbl values(1 , 'user1' , 3 , 3213 ),
(
2 , 'user2' , 4 , 123 ),
(
3 , 'user3' , 4 , 1312 ),
(
4 , 'user4' , 3 , 2355 ),
(
5 , 'user5' , 3 , 6765 ),
(
6 , 'user6' , 3 , 76577 );

SELECT
ID ,
NAME ,
G_ID,
G_SCORE ,
if(@gid is null or @gid<>G_ID,@c:=1,@c:=@c+1 ) as rank,
@gid:=G_ID
from tbl order by G_ID ASC, G_SCORE DESC

если зделаеш индехы, то не надо тебе дополнительного поля ранк, будет и так быстро работать

Спустя 20 минут, 18 секунд (1.08.2010 - 21:10) uMnepaTop написал(а):
ну как так.. прилагаю скрин, там у всех rank = 1
user posted image

Спустя 6 минут, 14 секунд (1.08.2010 - 21:16) SlavaFr написал(а):
if(@gid is null or @gid<>G_ID,@c:=1,@c:=@c+1 ) as rank

без пропуска делай! скопируй мой sql

Спустя 58 секунд (1.08.2010 - 21:17) uMnepaTop написал(а):
так я и скопировал smile.gif

Спустя 5 минут, 1 секунда (1.08.2010 - 21:22) uMnepaTop написал(а):
Покажи свой скрин, может другая версия БД или еще чего.. я уже ничего не понимаю, вообще..... ph34r.gif
Версия MySQL-клиента: 5.0.51a

Спустя 19 минут, 27 секунд (1.08.2010 - 21:41) SlavaFr написал(а):
version 5.1.33-community
но такие запросы и в 4 версии уже работали.

Спустя 11 минут, 59 секунд (1.08.2010 - 21:53) SlavaFr написал(а):
и упдате прекрасно сработала когда я добавил ранк поле и зделал упдате

update tbl inner join 
(SELECT ID, if(@gid is null or @gid<>G_ID,@c:=1,@c:= @c+1) as rank from tbl) as tbl2
on tbl.ID=tbl2.id
set g_rank=tbl2.rank;


edit: sory это упдате неправильное.

Спустя 8 минут, 58 секунд (1.08.2010 - 22:02) SlavaFr написал(а):
упс, упдате не правилно, я забыл order by зделать

еdit: нет, чето с упдате не получилось, надо наверное темп таблицу делать

Спустя 27 минут, 19 секунд (1.08.2010 - 22:30) SlavaFr написал(а):
A вот в таком виде и упдате получилось

create temporary table temp_tab
(
SELECT ID ,G_ID,G_SCORE ,G_RANK,
if(@gid is null or @gid<>G_ID,@c:=1,@c:=@c+1) as rank,
@gid:=G_ID
from tbl order by G_ID ASC, G_SCORE DESC
);

update tbl as tb
inner join temp_tab on tb.ID= temp_tab.id
set tb.g_rank= temp_tab.rank;

drop table temp_tab;

select * from tbl;

Спустя 2 часа, 50 минут, 11 секунд (2.08.2010 - 01:20) uMnepaTop написал(а):
ну я не знаю.. нечто какое-то..
user posted image

Спустя 8 часов, 12 минут, 6 секунд (2.08.2010 - 09:32) SlavaFr написал(а):
зделай на консоле и перед тем как основной селект запустить зделай в начале
select @gid:=-1,@c:=1;
чтоб инициализировать переменные.

Спустя 2 часа, 10 минут, 15 секунд (2.08.2010 - 11:42) uMnepaTop написал(а):
Не хочет mad.gif все.. я в танке ph34r.gif

Спустя 2 часа, 36 минут, 1 секунда (2.08.2010 - 14:18) uMnepaTop написал(а):
вот так вот получилось..
SELECT ID ,NAME , G_ID,G_SCORE ,if(@gid is null or @gid<>G_ID,@c:=1,@c:=@c+1 ) as rank,@gid:=G_ID from tbl order by G_ID ASC, G_SCORE DESC;
create temporary table temp_tab(SELECT ID, G_ID, G_SCORE, G_RANK, if(@gid is null or @gid<>G_ID,@c:=1,@c:=@c+1) as rank, @gid:=G_ID from tbl order by G_ID ASC, G_SCORE DESC);
update tbl as tb inner join temp_tab on tb.ID = temp_tab.id set tb.g_rank = temp_tab.rank;
drop table temp_tab;
select * from tbl;

Спустя 12 минут, 49 секунд (2.08.2010 - 14:31) uMnepaTop написал(а):
БЛИН, УРА!!!!!!!!!! БЛАГОДАРЮ ТЕБЯ ППЦ КАК!!!!!!!!!!!!!
Жаль денег нет, скинул бы!!!!!!!!!
Из 3 форумов ты единственный, кто умно мыслит!! Афигеть, я под действием аффекта))))) laugh.gif

Спустя 2 часа, 57 минут, 54 секунды (2.08.2010 - 17:29) SlavaFr написал(а):
1) за денги я не помогаю, а делаю.
2)"единстенный, кто помог" != "единстенный, кто умно мыслит". Ты ведь не хотел других обидеть? К тому же здесь не столко ум, сколько опыт помог.

Спустя 1 час, 1 минута, 12 секунд (2.08.2010 - 18:30) uMnepaTop написал(а):
Пофиг, ты все равно МОЗГ!!!! И другие не особо мне помогали.. dry.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.