2010-06-05 4 views
0

У меня есть небольшая система торгов, которую я использую для проекта фэнтезийного аукциона. Я пытаюсь использовать следующий запрос, чтобы поднять максимальные ставки для каждого игрока. Тем не менее, это не дает мне максимальную ставку, это просто дает мне первый вход в базу данных.MySQL Query: выигрышная ставка аукциона

SELECT Bid.id FROM bids AS Bid 
WHERE Bid.active =1 
GROUP BY player_id HAVING MAX(Bid.amount) 

Вот макет таблицы ставок, в случае, если это помогает:

CREATE TABLE IF NOT EXISTS `bids` (
    `id` int(10) NOT NULL AUTO_INCREMENT, 
    `user_id` int(10) NOT NULL, 
    `player_id` int(10) NOT NULL, 
    `amount` int(6) NOT NULL, 
    `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `winning_bid` int(1) NOT NULL DEFAULT '0', 
    `active` int(1) NOT NULL DEFAULT '1', 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ; 

ответ

3
select max(amount), player_id from bids 
where active = 1 
group by player_id 
order by 1 desc; 
1

Ever пункту должен сделать булеву проверку. Итак, ваш having MAX(Bid.Amount) не делает то, что вы думаете, что он делает. То, что вы (теоретически) хотите, это having Bid.Amount = MAX(Bid.Amount), хотя это приводит к большему количеству проблем, так как вы должны технически после этого группировать по Bid.Amount, поскольку он существует вне агрегата, и это совсем не то, что вы хотите сделать вообще.

(предупреждения, запросы ниже непроверенной, но они должны быть достаточно близки)

Если вы хотите максимальную ставку для одного игрока, что вы должны на самом деле сделать это очень просто, выберите первую запись при заказе по ставки в порядке убывания:

select 
    b.id 
from 
    bids b 
where 
    b.active = 1 
    and b.player_id = @playerID 
order by 
    b.bids desc 
limit 1 

Если вы хотите для всех игроков, этот запрос все еще дает отправную точку, вам просто нужно пройти в каждом отдельном player_id к нему:

select 
    bid.playerID, 
    bid.id 
from 
    bids bid 
    join (
    select 
     b.id 
    from 
     bids b 
    where 
     b.active = 1 
    order by 
     b.bids desc 
    limit 1 
) maxbid on maxbid.playerid = bid.playerid 
0

Вы можете попробовать:

SELECT Bid.id 
    FROM bids AS Bid, 
     (SELECT player_id, MAX(amount) AS player_max 
      FROM bids 
      WHERE active=1 
      GROUP BY player_id) AS max_amounts 
    WHERE Bid.player_id = max_amounts.player_id 
    AND Bid.amount = max_amounts.amount; 

Я уверен в поведении в случае связей, хотя.

+0

Предполагаю, что в случае связи самая ранняя ставка должна, вероятно, победить. –

0

Или альтернатива на Khorkrak (который конечно тоже работает):

SELECT Bid.id FROM bids AS Bid 
LEFT JOIN bids as x 
ON x.amount > Bid.amount 
AND x.active = 1 
AND x.player_id = Bid.player_id 
WHERE Bid.active = 1 AND x.player_id IS NULL 
GROUP BY player_id 
0

Вот один, используя строку ранга, чтобы найти самую высокую цену. Вы также можете использовать что-то вроде этого, чтобы найти 2-й максимум, 3-й максимум и т. Д.


SELECT id, player_id, amount 
FROM 
( 
select b.id, b.player_id, b.amount, count(*) as num 
from bids b left outer join bids b2 
on b.player_id = b2.player_id 
AND b.amount = b2.timestamp 
AND b.active = 1 
group by b.id, b.player_id, b.amount 
) 
r 
WHERE 
num = 1 
 
Смежные вопросы