2010-06-18 16 views
7

Tôi có ba bảng; Đấu giá, Đấu giá Đấu giá và Người dùng. Cấu trúc bảng trông giống như sau:Nhận kết quả cao nhất trong một 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 chỉ là bảng tiêu chuẩn, có id và tên người dùng.

Mục tiêu của tôi là tham gia các bảng này để tôi có thể nhận được giá trị cao nhất của các giá thầu này, cũng như nhận được tên người dùng liên quan đến các giá thầu đó; vì vậy tôi đã Kết quả là thiết lập như sau:

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

Cho đến nay câu hỏi của tôi là như sau:

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 

này được các hàng đơn Tôi sau đó, nhưng có vẻ như để hiển thị bid_amt thấp nhất, không cao nhất.

Trả lời

8

Bạn có thể sử dụng hàm MAX và chọn phụ để nhận giá thầu tối đa cho mỗi phiên đấu giá. Nếu bạn tham gia subselect này với các bảng khác của bạn và đặt mệnh đề where như sau, bạn sẽ nhận được những gì bạn đang tìm kiếm.

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 

Hy vọng điều đó sẽ hữu ích.

+0

Đây chính xác là những gì tôi cần. Cảm ơn! – Keithamus

0

Hãy thử điều này:

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 

Nếu điều đó không làm việc, hãy thử sử dụng một subselect trên auctionbids chứa một cái gì đó giống như

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

Hãy thử thêm các khoản sau đây; không chắc chắn về hiệu suất.

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

Không bao gồm giá thầu đấu giá từ truy vấn có giá thầu cao hơn cho cùng một phiên đấu giá.

Vấn đề duy nhất là nếu bạn có 2 giá thầu bằng nhau và cả hai đều sẽ liệt kê. Một cách để loại bỏ chúng - nhưng đó là lựa chọn chiến thắng tương đối tùy ý, là sử dụng id giá thầu:

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

Đây là vấn đề tổng hợp trong nhóm điển hình. Bạn có thể giải quyết nó bằng cách sử dụng cái gọi là tự trừ trái tham gia

Hãy thử như sau:

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 

Về cơ bản nó xây dựng một gia giữa bên trái và bên phải, cho đến khi nó không tìm thấy một cho bên trái nữa, và đó là phần tử cao nhất sau đó.

Một giải pháp khác sẽ sử dụng nhiều truy vấn (tất nhiên) hoặc bảng tổng hợp tạm thời.

+0

Bạn không cần một tham gia trái trên bảng người dùng. Nó được nối với bảng 'auction_bids ab' và sẽ luôn có người dùng ở đó. Câu hỏi: có thể cho nhiều người dùng đặt giá thầu cùng một số tiền cho một phiên đấu giá không?Truy vấn hiển thị tất cả chúng với giá thầu cao nhất. Ngoài ra, tôi là curios nếu điều này sẽ làm việc đủ nhanh khi các bảng phát triển hơn một vài nghìn hàng. – ceteras

0

Đây là những gì bạn có thể try..like school..nothing cũ new..no cần phải đi cho trái tham gia hoặc bất cứ điều gì else..rest phụ thuộc vào yêu cầu chính xác của bạn

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 
Các vấn đề liên quan