【问题标题】:MySQL JOIN around subquery resultMySQL JOIN 围绕子查询结果
【发布时间】:2012-05-31 10:10:25
【问题描述】:

我有这个查询(请注意,所有 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,然后加入(子查询的结果)或任何干净的方法?

旁注:查询优化器是否会认识到这一点,使其不那么重要?

谢谢

【问题讨论】:

    标签: mysql join subquery


    【解决方案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
    

    【讨论】:

    • 这是完美的,只是我的原始查询还返回了 product_bids 中没有对应行的产品。其中一个可以是left join 吗?
    • @Adam:是的,绝对是(尽管我已经订购了它们,但您实际上会想要RIGHT JOIN product ...)。
    • 刚刚在您发布时发现了这一点。谢谢。完美。
    【解决方案2】:

    在一个 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 需要等于一条记录所具有的值,否则您将乘以不想要的行。如果不是这种情况(这意味着您不能依赖于一个是顶部),那么您的提案也会遇到类似的问题,因为您尚未定义具有最长日期的哪些记录在前。

    【讨论】:

      猜你喜欢
      • 2017-09-27
      • 2016-09-10
      • 1970-01-01
      • 1970-01-01
      • 2017-01-16
      • 1970-01-01
      • 1970-01-01
      • 2015-02-07
      • 2016-01-02
      相关资源
      最近更新 更多