【问题标题】:Getting highest results in a JOIN在 JOIN 中获得最高结果
【发布时间】:2011-03-05 08:09:35
【问题描述】:

我有三张桌子;拍卖、拍卖出价和用户。表结构如下所示:

Auctions:

 id    title
 --    -----
  1     Auction 1
  2     Auction 2

Auction Bids:

 id    user_id    auction_id    bid_amt
 --    -------    ----------    -------
  1       1            1          200.00
  2       2            1          202.00
  3       1            2          100.00

Users 只是一个标准表,带有 id 和用户名。

我的目标是加入这些表格,以便获得这些出价的最高值,以及与这些出价相关的用户名;所以我有一个这样的结果集:

auction_id    auction_title    auctionbid_amt    user_username
----------    -------------    --------------    -------------
         1    Auction 1            202.00            Bidder2
         2    Auction 2            100.00            Bidder1

到目前为止,我的查询如下:

SELECT a.id, a.title, ab.bid_amt, u.display_name FROM auction a
    LEFT JOIN auctionbid ab ON a.id = ab.auction_id
        LEFT JOIN users u ON u.id = ab.user_id
GROUP BY a.id

这得到了我所追求的单行,但它似乎显示了最低的bid_amt,而不是最高的。

【问题讨论】:

    标签: sql mysql join


    【解决方案1】:

    这是你可以尝试的......就像老学校一样......没有新东西......不需要左加入或其他任何东西......其余取决于你的确切要求

    select A.id,A.title,max(AB.bid_amt),name
    from Auction A,AuctionBids AB,Users U
    where U.ID=AB.USER_ID AND A.ID=AB.ID
    group by A.ID,A.title,name
    

    【讨论】:

      【解决方案2】:

      您可以使用 MAX 函数和子选择来获得每次拍卖的最高出价。如果您将此子选择与您的其他表连接起来,并按如下方式设置 where 子句,您应该会得到您要查找的内容。

      SELECT a.id, a.title, ab.bid_points, u.display_name 
      FROM Auction AS a
      INNER JOIN (SELECT auction_id, MAX(bid_points) AS maxAmount FROM auction_bids GROUP BY auction_id) AS maxBids ON maxBids.auction_id = a.id
      INNER JOIN auction_bids AS ab ON a.id = ab.auction_id
      INNER JOIN users AS u ON u.id = ab.user_id
      WHERE ab.auction_id = maxBids.auction_id AND ab.bid_amount = maxBids.maxAmount
      

      希望对您有所帮助。

      【讨论】:

        【解决方案3】:

        这是一个典型的组内聚合问题。您可以使用所谓的 left self exclude join

        来解决它

        尝试以下方法:

        SELECT a.id, a.title, ab.bid_points, u.displayname
          FROM auction a
          INNER JOIN auction_bids ab ON ab.auction_id = a.id
          LEFT JOIN auction_bids b1 ON ab.auction_id = b1.auction_id
            AND ab.bid_points < b1.bid_points
          LEFT JOIN users u ON u.id = ab.user_id
          WHERE b1.auction_id IS NULL
        

        它基本上在左侧和右侧之间建立了一个连接,直到它不再为左侧找到一个连接,那就是最高的元素。

        另一种解决方案是使用多个查询(当然)或一个临时聚合表。

        【讨论】:

        • 您不需要在 users 表上进行左连接。它与auction_bids ab 表连接,那里总会有一个用户。问题:是否可以有多个用户为拍卖出价相同的金额?查询显示所有出价最高的。另外,我很好奇当表格增长超过几千行时这是否能足够快地工作。
        【解决方案4】:

        尝试添加以下子句;不确定性能。

        WHERE NOT EXISTS
           (SELECT * FROM auctionbid abhigher
            WHERE abhigher.auction_id = ab.auction_id
            AND   abhigher.auctionbid_amt > ab.auctionbid_amt)
        

        从查询中排除对同一拍卖具有更高出价的拍卖出价。

        唯一的问题是,如果您有 2 个相同的出价并且两者都会列出。摆脱它们的一种方法 - 但它是一个相对武断的获胜者选择,是使用投标 ID:

        WHERE NOT EXISTS
           (SELECT * FROM auctionbid abhigher
            WHERE abhigher.auction_id = ab.auction_id
            AND   abhigher.auctionbid_amt >= ab.auctionbid_amt
            AND   abhigher.id > ab.id)
        

        【讨论】:

          【解决方案5】:

          试试这个:

          SELECT a.id, a.title, ab.bid_points, u.display_name FROM auction a
              LEFT JOIN auctionbid ab ON a.id = ab.auction_id
                  LEFT JOIN users u ON u.id = ab.user_id
          GROUP BY a.id
          ORDER BY ab.bid_points DESC
          

          如果这不起作用,请尝试在包含类似内容的竞价上使用子选择

          SELECT id, user_id, auction_id, MAX(bid_amt) FROM action_bids GROUP BY auction_id
          

          【讨论】:

            猜你喜欢
            • 2020-03-03
            • 1970-01-01
            • 2013-02-11
            • 2016-04-04
            • 1970-01-01
            • 2021-06-26
            • 1970-01-01
            • 1970-01-01
            • 2011-08-18
            相关资源
            最近更新 更多