SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 12.12.2011 15:13:18

Фяшя
Участник
Зарегистрирован: 22.02.2011
Сообщений: 11

выборка с сортировкой по 2 параметрам (Очень сложный запрос)

Здравствуйте многоуважаемые!


Есть таблица истории побед в игре

CREATE TABLE IF NOT EXISTS `championat_history` (
  `uid` int(11) NOT NULL,
  `id` int(11) NOT NULL,
  `status` int(11) NOT NULL,
  `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'время записи',
  `reopen` int(11) NOT NULL,
  UNIQUE KEY `uid` (`uid`,`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;



и еще есть таблица с именами и аватарами пользователей

CREATE TABLE IF NOT EXISTS `championat_users` (
  `uid` int(11) NOT NULL,
  `ava` int(11) NOT NULL,
  `name` varchar(200) CHARACTER SET utf8 NOT NULL DEFAULT 'Некий пользователь',
  PRIMARY KEY (`uid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;











Есть рабочая ВЫБОРКА (спасибо evgeny)
которая выводит id, имя, аватар, рейтинг за эту неделю, рейтинг за прошлую неделю, позицию на этой неделе, позицию на той неделе и общее количество ответов

SELECT
`all`.uid AS uid,`names`.name,`names`.ava,`all`.cnt AS rate1,`exclude_today`.cnt AS rate2, `all`.pos AS pos1,  `exclude_today`.ed_pos AS pos2,`allks`.ks AS ks
FROM
(SELECT a.*,(@pos:=@pos+1) pos  FROM
    (SELECT uid,COUNT(uid) cnt FROM championat_history WHERE `status`=1 AND YEAR(`time`)=YEAR(NOW()) AND week(`time`)=week(NOW()) GROUP BY uid ORDER BY COUNT(uid)+ABS(uid/1000000000) DESC) a,(select @pos:=0) z
) `all`
LEFT JOIN
  (SELECT a.* FROM
    (SELECT COUNT(uid) ks,uid FROM championat_history WHERE YEAR(`time`)=YEAR(NOW()) AND week(`time`)=week(NOW()) GROUP BY uid ORDER BY ks DESC) a
) `allks` ON(all.uid=`allks`.uid)
LEFT JOIN
  (SELECT a.*,(@ed_pos:=@ed_pos+1) ed_pos  FROM
    (SELECT COUNT(uid) cnt,uid FROM championat_history WHERE `status`=1
   AND YEAR(`time`)=YEAR(NOW()-INTERVAL 1 week) AND week(`time`)=week(NOW()-INTERVAL 1 week) GROUP BY uid ORDER BY cnt DESC) a,(select @ed_pos:=0) z
) `exclude_today` ON(all.uid=`exclude_today`.uid)
LEFT JOIN
  (SELECT uid,name,ava from championat_users)`names` ON(all.uid=`names`.uid)
limit 0,10




ПРОБЛЕМА в том что она выбирает список сортируя по рейтингу за текущую неделю (rate1)
и при этом получается что если у 2 человек одинаковый рейтинг то путаница в позиции в таблице (то одного покажет то другого)

Прошу помочь сделать выборку сортируя не только по рейтингу недели (rate1) но и ПЛЮС к этому по количеству ответов (`allks`.ks)

чтобы тот у кто набрал 20 очков за 10 ходов был выше чем тот кто набрал 20 очков за 11 ходов


СПАСИБО! очень надеюсь на вашу помощь

Неактивен

 

#2 12.12.2011 16:04:20

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: выборка с сортировкой по 2 параметрам (Очень сложный запрос)

Если я вас правильно понял, то вам нужно просто отсортировать ?

SELECT
`all`.uid AS uid,`names`.name,`names`.ava,`all`.cnt AS rate1,`exclude_today`.cnt AS rate2, `all`.pos AS pos1,  `exclude_today`.ed_pos AS pos2,`allks`.ks AS ks
FROM
(SELECT a.*,(@pos:=@pos+1) pos  FROM
    (SELECT uid,COUNT(uid) cnt FROM championat_history WHERE `status`=1 AND YEAR(`time`)=YEAR(NOW()) AND week(`time`)=week(NOW()) GROUP BY uid ORDER BY COUNT(uid)+ABS(uid/1000000000) DESC) a,(select @pos:=0) z
) `all`
LEFT JOIN
  (SELECT a.* FROM
    (SELECT COUNT(uid) ks,uid FROM championat_history WHERE YEAR(`time`)=YEAR(NOW()) AND week(`time`)=week(NOW()) GROUP BY uid ORDER BY ks DESC) a
) `allks` ON(all.uid=`allks`.uid)
LEFT JOIN
  (SELECT a.*,(@ed_pos:=@ed_pos+1) ed_pos  FROM
    (SELECT COUNT(uid) cnt,uid FROM championat_history WHERE `status`=1
   AND YEAR(`time`)=YEAR(NOW()-INTERVAL 1 week) AND week(`time`)=week(NOW()-INTERVAL 1 week) GROUP BY uid ORDER BY cnt DESC) a,(select @ed_pos:=0) z
) `exclude_today` ON(all.uid=`exclude_today`.uid)
LEFT JOIN
  (SELECT uid,name,ava from championat_users)`names` ON(all.uid=`names`.uid)
ORDER BY rate1,ks DESC
limit 0,10

Отредактированно evgeny (12.12.2011 16:04:50)

Неактивен

 

#3 12.12.2011 16:42:06

Фяшя
Участник
Зарегистрирован: 22.02.2011
Сообщений: 11

Re: выборка с сортировкой по 2 параметрам (Очень сложный запрос)

В том то и загвоздка, что при таком методе сортировки ( в конце запроса  rate1,ks DESC)
получается что те у кого рейтинг меньше - отображаются вначале... см. прикрепленный скрин

http://sqlinfo.ru/forum/attachment.php?item=298&download=1

Отредактированно Фяшя (12.12.2011 16:42:50)


Прикрепленные файлы:
Attachment Icon Безымянный.JPG, Размер: 37,647 байт, Скачано: 1,239

Неактивен

 

#4 12.12.2011 19:55:01

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: выборка с сортировкой по 2 параметрам (Очень сложный запрос)

Опечатка :-)
rate1 DESC,ks DESC

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson