2010-06-18 8 views
7

Mam trzy tabele; Aukcje, aukcje i użytkownicy. Struktura tabeli wygląda tak:Uzyskiwanie najwyższych wyników w DOŁĄCZU

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 jest tylko standardowy stół z id i nazwę użytkownika.

Moim celem jest dołączenie do tych tabel, aby uzyskać najwyższe wartości tych stawek, a także uzyskać nazwy użytkowników powiązane z tymi stawkami; Mam więc wynik ustawione tak:

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

Dotychczas moja kwerenda jest następujący:

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 

ten pobiera pojedyncze wiersze mogę później, ale wydaje się, aby wyświetlić najniższą bid_amt, nie najwyższy.

Odpowiedz

8

Możesz użyć funkcji MAX i podsekcji, aby uzyskać maksymalną stawkę dla każdej aukcji. Jeśli przyłączysz się do tej podselekcji z innymi tabelami i ustawisz klauzulę where w następujący sposób, powinieneś otrzymać to, czego szukasz.

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 

Nadzieję, że pomaga.

+0

To jest dokładnie to, czego potrzebowałem. Dzięki! – Keithamus

0

Spróbuj tego:

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 

Jeśli to nie zadziała, spróbuj użyć podselekcji na auctionbids zawierających coś podobnego

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

spróbuj dodać następującą klauzulę; nie jestem pewien co do wydajności.

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

Nie obejmuje ofert aukcyjnych z zapytania o wyższą stawkę dla tej samej aukcji.

Jedynym problemem jest to, że jeśli masz dwie równe oferty, a obie zostaną wymienione. Jednym ze sposobów, aby pozbyć się z nich - ale jest to stosunkowo arbitralny wybór zwycięzcy jest użycie identyfikatora oferta:

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

Jest to typowy problem, w ciągu grupami kruszywo. Można rozwiązać to za pomocą tzw lewy wykluczenia samodzielne dołączyć

Spróbuj wykonać następujące czynności:

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 

To w zasadzie tworzy połączenie pomiędzy lewą i prawą stroną, dopóki nie znajdzie jeden dla po lewej stronie i to jest najwyższy element w tym momencie.

Innym rozwiązaniem byłoby użycie wielu zapytań (oczywiście) lub tymczasowej tabeli zbiorczej.

+0

Nie trzeba lewe dołączenie do tabeli użytkowników. Jest połączony z tabelą "auction_bids ab'" i zawsze będzie tam użytkownik. Pytanie: czy więcej niż jeden użytkownik może licytować taką samą kwotę na aukcję?Zapytanie pokazuje wszystkie z najwyższą ofertą. Ponadto, jestem ciekawostką, czy to zadziała wystarczająco szybko, gdy tabele rosną więcej niż kilka tysięcy wierszy. – ceteras

0

Oto co można try..like stare school..nothing new..no trzeba iść do lewej przyłączyć lub cokolwiek else..rest zależy od dokładnego wymogu

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 
Powiązane problemy