2010-06-18 10 views
7

Ich habe drei Tabellen; Auktionen, Auktionsgebote und Nutzer. Die Tabellenstruktur sieht wie folgt aus:Erhalte die höchsten Ergebnisse in einem JOIN

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 nur eine Standard-Tabelle, mit der ID und Benutzernamen.

Mein Ziel ist es, diese Tabellen zu verbinden, damit ich die höchsten Werte dieser Gebote erhalten kann, sowie die Benutzernamen für diese Gebote erhalten; so habe ich ein Ergebnis wie so gesetzt:

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

Bisher meine Abfrage wie folgt:

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 

Diese bekommt die einzelnen Zeilen ich nach bin, aber es scheint, die niedrigste bid_amt angezeigt werden, nicht das höchste.

Antwort

8

Sie können die MAX-Funktion und eine Unterauswahl verwenden, um das Höchstgebot für jede Auktion zu erhalten. Wenn Sie diesen Subselect mit Ihren anderen Tabellen verbinden und die where-Klausel wie folgt setzen, sollten Sie das bekommen, wonach Sie suchen.

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 

Hoffe, dass hilft. Hier

+0

Das ist genau das, was ich brauchte. Vielen Dank! – Keithamus

0

Versuchen Sie folgendes:

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 

Wenn das nicht funktioniert, versuchen, eine subselect auf auctionbids mit etwas enthält, wie

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

Versuchen Sie, die folgende Klausel hinzuzufügen; bin mir nicht sicher über die Leistung.

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

Ausgeschlossen sind Auktionsgebote der Suchanfrage, die ein höheres Gebot für dieselbe Auktion haben.

Das einzige Problem ist, dass wenn Sie 2 gleiche Gebote haben und beide werden auflisten. Ein Weg, um sie loszuwerden - aber es ist eine relativ willkürliche Auswahl der Gewinner ist das Gebot ID zu verwenden:

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

Dies ist ein typisches innerhalb Gruppe Aggregat Problem. Sie können es eine so genannte links Selbst Ausschluss beitreten

Versuchen Sie Folgendes lösen mit:

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 

Es baut im Grunde eine zwischen der linken und der rechten Seite kommen, bis es nicht eine für die nicht finden linke Seite mehr, und das ist dann das höchste Element.

Eine andere Lösung wäre die Verwendung mehrerer Querys (natürlich) oder eine temporäre Aggregattabelle.

+0

Sie brauchen nicht eine linke Join auf Benutzer Tabelle. Es wird mit der Tabelle "auction_bids ab" verknüpft, und es wird immer einen Benutzer geben. Frage: Ist es möglich, dass mehr als ein Nutzer den gleichen Betrag für eine Auktion bietet?Die Abfrage zeigt alle mit dem höchsten Gebot. Ich bin auch neugierig, wenn dies schnell genug funktioniert, wenn die Tabellen mehr als ein paar tausend Zeilen wachsen. – ceteras

0

ist, was Sie alte school..nothing try..like kann new..no müssen für links gehen beitreten oder irgendetwas else..rest auf Ihre genaue Anforderung hängt

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 
Verwandte Themen