Какой SQL-запрос я бы запустил, чтобы получить список проигранных аукционов? (пример eBay) - PullRequest
2 голосов
/ 22 мая 2011

Я попытаюсь привести пример "eBay", я уверен, что это будет самый простой способ задать это.

Представьте себе таблицу bids:

bid_id | bid_from_user | bid_for_auction | bid_price
1      | 150           | 1               | 20
2      | 453           | 1               | 30
3      | 42            | 1               | 50
4      | 12            | 2               | 12
5      | 60            | 2               | 20

Представьте, что вам нужно перечислить аукционы, на которые определенный человек в настоящее время делает ставку и проигрывает .

Следовательно, наш текущий идентификатор пользователя 12, поэтому bid_from_user='12'

Этот пользователь в настоящее время участвует в торгах с идентификатором 2 по цене 12 и явно проигрывает, поскольку на этом же аукционе есть еще один пользователь с более высокой ценой.

Я не хочу перечислять все аукционы, в которых участвует пользователь, я просто хочу перечислить те, в которых он участвует на и проигрыше (= не на тех, которые он выигрывает).

Итак, какой запрос я запускаю для этого?

Ответы [ 2 ]

7 голосов
/ 22 мая 2011
SELECT b.bid_id, b.bid_from_user, b.bid_for_auction, b.bid_price
  FROM bids b
 WHERE b.bid_from_user = '12'
   AND EXISTS (
           SELECT 1 
             FROM bids x 
            WHERE x.bid_for_auction = b.bid_for_auction
              AND x.bid_price > b.bid_price
              AND x.bid_from_user <> b.bid_from_user);

Редактировать: Казалось бы, вышеизложенное является наиболее чистым, наиболее разборчивым решением;но есть альтернатива в MySQL, которая традиционно плохо обрабатывает подзапросы ...

  SELECT b.bid_for_auction
    FROM bids b
         JOIN bids x ON x.bid_for_auction = b.bid_for_auction
     AND x.bid_price > b.bid_price
     AND x.bid_from_user <> b.bid_from_user
   WHERE b.bid_from_user = '12'
GROUP BY b.bid_for_auction;
1 голос
/ 22 мая 2011

Значения в выборке только для доказательства:

  SELECT MAX( a.bid_price ), a.bid_for_auction, b.bid_price
    FROM bids a 
         INNER JOIN bids b ON a.bid_for_auction = b.bid_for_auction
   WHERE b.bid_from_user = 12 
GROUP BY bid_for_auction
  HAVING b.bid_price < MAX(a.bid_price);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...