Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Топ по полю


Автор: Aliance 17.11.2006, 14:33
Имеем таблицу:
Код

-- 
-- Структура таблицы `members_dungeon_items`
-- 

CREATE TABLE `members_dungeon_items` (
  `member_id` smallint(4) unsigned NOT NULL default '0',
  `item_id` smallint(4) unsigned NOT NULL default '0',
  `quantity` tinyint(3) unsigned NOT NULL default '0'
) TYPE=MyISAM;

-- 
-- Дамп данных таблицы `members_dungeon_items`
-- 

INSERT INTO `members_dungeon_items` (`member_id`, `item_id`, `quantity`) VALUES
(1, 31, 20),
(1, 30, 1),
(9, 31, 1),
(9, 25, 10),
(19, 5, 40),
(20, 2, 1),


Хочу создать топ3 из данной таблицы, по кол-ву предметов (поле `quantity`). Алгоритм таков, имеем юзера, берем все записи с его кол-вом предметов и суммируем их, затем так со всеми юзерами и выводим троих, чья сумма наибольшая. В даннос случае это юзеры с ID 1, 9 и 19.
Вот что должно получиться:
Юзер 19 - 40 штук
Юзер 1 - 21 штука
Юзер 9 - 11 штук

Юзер 20 - 1 штука

Пытался копать в сторону функции MAX() - но, видимо, неправлиьно копал smile

Автор: skyboy 17.11.2006, 14:42
Код

SELECT member_id,sum(quantity) as some_sum
FROM members_dungeon_items
GROUP BY member_id
ORDER BY some_sum
LIMIT 3

так?

Автор: SelenIT 17.11.2006, 14:43
только ORDER BY some_sum DESC по идее

Автор: Kesh 17.11.2006, 14:43
Код

SELECT * FROM `members_dungeon_items`
WHERE `member_id` in (1, 9, 19)
ORDER BY `quantity` DESC

Автор: skyboy 17.11.2006, 14:44
сорри. надо было 
"ORDER BY some_sum DESC"

Добавлено @ 14:45 
Цитата(SelenIT @  17.11.2006,  13:43 Найти цитируемый пост)
только ORDER BY some_sum DESC по идее 

да.. перепутал, спасибо smile

Автор: wetlook 17.11.2006, 15:07
Hi ! Попробуй так:
Код

//цикл по кол-ву юзеров
foreach($user as $u) {

    $sql="select sum(quanity) as Q from members_dungeon_items where member_id=$u";
    $rez=mysql_query($sql);
    $r=mysql_fetch_row($rez);
    $usersQuanity[$u]=$r['Q'];

}
$i=0;
foreach($usersQuanity as $user=>$value) {
   
    if ($value==max($userQuanity && $i != 2) ) {
    
         $top3[$i]=max($userQuanity);
         unset($userQuanity[$u]);
         $i++;
    }
   if($i==3) break;
}


Автор: Aliance 17.11.2006, 20:23
skyboy, спасибо за решение!

Kesh и wetlook, число юзеров зарание не известно. Поэтому ваши варианты не подходят.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)