MySQL在子查询结果周围加入

时间:2012-05-31 10:10:25

标签: mysql join subquery

我有这个查询(请注意,所有3个子查询都在从同一行中选择不同的列)。基本上我想获取product_bid中的行,其中product行的最大日期为。

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,并加入(子查询的结果)或任何干净的方式来做这个?

Side Note :查询优化程序是否会识别此问题,使其不那么重要?

由于

2 个答案:

答案 0 :(得分:1)

您可以将表格与子查询一起加入,该子查询为每种产品选择最新的出价日期:

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

答案 1 :(得分: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需要相当于一个记录所具有的值,否则您将乘以您不想要的行。如果不是这种情况(这意味着你不能依赖于一个人),你的提案也会遇到类似的问题,因为你还没有定义哪个记录的最大日期是最先出现的。