Mysql 我将运行什么SQL查询来获取我丢失的拍卖列表?(易趣示例)

Mysql 我将运行什么SQL查询来获取我丢失的拍卖列表?(易趣示例),mysql,sql,Mysql,Sql,我将尝试举一个易趣的例子,我相信这将是最简单的提问方式 想象一个投标表格: 想象一下,你需要列出某个人当前竞价并输掉的拍卖 因此,我们当前的用户ID是12,所以请从\u user='12'出价 该用户当前正在竞价拍卖id 2上以12的价格进行竞价,并且明显失败,因为有另一个用户以更高的价格竞价同一次拍卖 我不想列出用户正在竞价的所有拍卖,我只想列出用户正在竞价但失败的拍卖,而不是他赢的拍卖 那么,我应该运行什么查询来实现这一点呢 SELECT b.bid_id, b.bid_from_user,

我将尝试举一个易趣的例子,我相信这将是最简单的提问方式

想象一个投标表格:

想象一下,你需要列出某个人当前竞价并输掉的拍卖

因此,我们当前的用户ID是12,所以请从\u user='12'出价

该用户当前正在竞价拍卖id 2上以12的价格进行竞价,并且明显失败,因为有另一个用户以更高的价格竞价同一次拍卖

我不想列出用户正在竞价的所有拍卖,我只想列出用户正在竞价但失败的拍卖,而不是他赢的拍卖

那么,我应该运行什么查询来实现这一点呢

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;

选择中的值仅用于验证:

  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);

它只是为用户选择不在按AuctionExact分组的最大值内的行-请选择1是什么?1让EXISTS知道子查询返回了一些内容。1可以是你喜欢的任何东西,例如42,甚至是空的。谢谢,这行得通,我有没有可能重写它来获取用户正在赢得的拍卖?我试过了,但失败了…@RiMMER:用notexists代替EXISTS,尝试与我上面答案中的第一个查询相同的查询。这种想法是,一个用户赢得的拍卖不应该有其他用户更高的出价。
  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);