【问题标题】:MySQL query help (join, subselect)MySQL 查询帮助(连接、子选择)
【发布时间】:2014-05-01 09:15:09
【问题描述】:

我有两张桌子:orders 和 bookings。

orders 表包含来自客户的唯一订单。每个客户都预订了 1 到 5 年的储物柜,因此预订表可以包含 1 到 5 行 pr。订单(每年 1 行)。预订表中的每一行都包含和 end_date ,它是每年相同的日期(20XX-06-30)。

我想选择bookings表中对应final end_date为今年(2014-06-30)的所有订单。

SELECT DISTINCT orders.id 
FROM   orders, 
   bookings 
WHERE  orders.id = bookings.order_id 
   AND bookings.end_date = '2014-06-30' 

此查询的问题在于,它还选择了预订行中 end_date 在接下来几年(2015 年 6 月 30 日、2016 年 6 月 30 日等)继续的订单。

【问题讨论】:

  • 我花了一点时间来解析你的问题。最好包含一个示例数据集和预期结果,以使您的问题更加明显。

标签: mysql sql


【解决方案1】:

我不确定我是否理解得很好,但这是我理解的解决方案,这应该会为您提供最后结束日期(最大值)为 2014-06-30 的订单 ID。

SELECT orders.id, MAX(bookings.end_date)
FROM orders INNER JOIN bookings 
ON orders.id = bookings.order_id 
GROUP BY bookings.order_id
HAVING MAX(bookings.end_date) = '2014-06-30'

【讨论】:

    【解决方案2】:

    可能再次加入预订,检查相同订单 ID 的更大预订日期:-

    SELECT orders.id 
    FROM orders
    INNER JOIN bookings ON orders.id = bookings.order_id 
    LEFT OUTER JOIN bookings2 ON orders.id = bookings2.order_id AND bookings2.end_date > bookings.end_date
    WHERE bookings.end_date = '2014-06-30'
    AND bookings2.end_date IS NULL
    

    【讨论】:

    • 好的,这应该可行,尽管我认为我更喜欢@CodeBird 的回答。
    • 没问题。看到他们的建议,我可能也会去采纳(我对使用 HAVING 有一点反感,但这只是个人喜好)。
    猜你喜欢
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    相关资源
    最近更新 更多