2012-05-31 112 views
0

我有這個查詢(注意,所有3個子查詢都從同一行中選擇不同的列)。本質上,我想獲得product_bid中的行,最大日期與product行一起。MySQL加入子查詢結果

SELECT 
p.product_id, 
p.product_title, 
(SELECT b.bid_id FROM product_bids b WHERE b.bid_product_id=p.product_id ORDER BY b.bid_date DESC LIMIT 1) AS bid_id, 
(SELECT b.bid_date FROM product_bids b WHERE b.bid_product_id=p.product_id ORDER BY b.bid_date DESC LIMIT 1) AS bid_date, 
(SELECT b.bid_amount FROM product_bids b WHERE b.bid_product_id=p.product_id ORDER BY b.bid_date DESC LIMIT 1) AS bid_amount 

FROM product p 

WHERE p.product_auction_id=325 

有沒有辦法做一次子查詢得到的product_bids的PK,並就加入(子查詢的結果),或這樣做的任何干淨的方式?

注意事項:查詢優化器是否能識別這個問題,使它不那麼重要?

感謝

回答

0

您可以用選擇每個產品的最新報價日期子查詢加入你的表連接在一起:

SELECT p.product_id, b.bid_id, b.bid_date, b.bid_amount 
FROM product_bids AS b NATURAL JOIN (
     SELECT bid_product_id, MAX(bid_date) AS bid_date 
     FROM  product_bids 
     GROUP BY bid_product_id 
     ) AS t 
    JOIN product AS p ON p.product_id = b.bid_product_id 
WHERE p.product_auction_id = 325 
+0

這是完美的,只是我的原始查詢也退回的產品在'product_bids'沒有相應的行。其中的一個可以是「左連接」嗎? – Adam

+0

@亞當:是的,絕對的(雖然我已經命令他們,但實際上你會想'RIGHT JOIN product ...')。 – eggyal

+0

剛發佈時就已經想出了它。謝謝。完善。 – Adam

0

做這一個SQL查詢內部可能很艱難,但我有這個建議。選擇從product_bids最大的日期,然後再進行第二次查詢是這樣的:

select p.product_id, p.product_title, b.bid_id, b.bid_date, b.bid_amount 
from product p 
inner join product_bids b on b.bid_date = @yourselectedbiddate 

這應該獲取完全相同的數據,但具有更高的性能。請注意,@ yourselectedbiddate需要相當於一個記錄的值,否則您將乘以不需要的行。如果不是這種情況(這意味着您不能依靠頂級人員),則您的提案有類似的問題,因爲您尚未定義具有最高日期的哪條記錄最先到達。