2010-06-18 11 views
7

में उच्चतम परिणाम प्राप्त करना मेरे पास तीन टेबल हैं; नीलामी, नीलामी बोलियां और उपयोगकर्ता। तालिका संरचना इस तरह दिखता है:जॉइन

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 सिर्फ एक मानक तालिका है, आईडी और उपयोगकर्ता नाम के साथ।

मेरा लक्ष्य इन तालिकाओं में शामिल होना है, इसलिए मैं इन बोलियों के उच्चतम मूल्य प्राप्त कर सकता हूं, साथ ही उन बोलियों से संबंधित उपयोगकर्ता नाम प्राप्त कर सकता हूं; तो मैं एक परिणाम तो तरह की स्थापना की है:

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 प्रदर्शित करने के लिए, नहीं लगता है उच्चतम। कि, काम नहीं करता है की तरह

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

उत्तर

8

आप प्रत्येक नीलामी के लिए अधिकतम बोली प्राप्त करने के लिए अधिकतम-फ़ंक्शन और उप-चयन का उपयोग कर सकते हैं। यदि आप अपनी अन्य सारणी के साथ इस उप-चयन में शामिल होते हैं और निम्न खंड कहां सेट करते हैं, तो आपको वह चीज़ मिलनी चाहिए जो आप खोज रहे हैं।

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 

आशा है कि मदद करता है।

+0

यह वही है जो मुझे चाहिए था। धन्यवाद! – Keithamus

0

इस प्रयास करें प्रदर्शन के बारे में निश्चित नहीं है।

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

उसी नीलामी के लिए उच्च बोली रखने वाली क्वेरी से नीलामी बोलियां बहिष्कृत करता है।

एकमात्र समस्या यह है कि यदि आपके पास 2 बराबर बोलियां हैं और दोनों सूचीबद्ध होंगे।

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

निम्नलिखित खंड जोड़ने की कोशिश कुछ युक्त auctionbids पर एक subselect का उपयोग करके देखें

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 

;:

1

यह एक ठेठ भीतर-समूह कुल समस्या है: - एक तरह से उनमें से छुटकारा पाने के लिए, लेकिन यह विजेता का एक अपेक्षाकृत मनमाना विकल्प है, बोली आईडी का उपयोग करने के लिए है। आप इसे

में शामिल होने के एक तथाकथित बाईं स्वयं बहिष्करण का उपयोग करने का प्रयास करें हल कर सकते हैं निम्नलिखित:

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 

यह मूल रूप से एक, बाएँ और दाएँ पक्ष के बीच में शामिल होने के लिए जब तक इसके लिए एक नहीं मिल रहा है बनाता है अब बाईं तरफ, और तब उच्चतम तत्व है।

एक और समाधान एकाधिक क्वेरी (बेशक) या अस्थायी कुल तालिका का उपयोग करेगा।

+0

आप की जरूरत नहीं है new..no बाईं में शामिल होने के लिए जाना या कुछ भी else..rest अपने सटीक आवश्यकता पर निर्भर करता है की जरूरत है सकते हैं उपयोगकर्ता तालिका पर एक बाएं शामिल हों। यह 'auction_bids ab' तालिका से जुड़ा हुआ है, और हमेशा वहां एक उपयोगकर्ता होगा। प्रश्न: क्या एक से अधिक उपयोगकर्ता नीलामी के लिए समान राशि बोली लगाने के लिए संभव है?क्वेरी उन सभी को उच्चतम बोली के साथ दिखाती है। इसके अलावा, मैं curios हूँ अगर यह कुछ हजार पंक्तियों से अधिक बढ़ने पर पर्याप्त तेज़ी से काम करेगा। – ceteras

0

यहाँ तुम क्या वर्ष school..nothing try..like

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 
संबंधित मुद्दे