【问题标题】:MYSQL select query with multiple tables具有多个表的 MYSQL 选择查询
【发布时间】:2013-12-18 12:07:29
【问题描述】:

我有两张桌子,

  1. prices (pcode, date, priceperweek)
    • 1 条记录涵盖 1 周
  2. booked (pcode, date)
    • 1 条记录 = 1 天,因为有短线可供使用

一个表单由3个字段组成

  1. 开始日期
  2. 灵活性(+/- 1/2/3 周)
  3. 持续时间(3 / 4 / 5 / 6 / 7 / 14))。

下面的查询应该是选择价格和日期,并检查所选的开始日期是否出现在价格表中,以及从开始日期开始的每一天是否都没有出现在预订表中。

SELECT SUM(priceperweek) AS `ppw`, prices.date AS `startdate`
FROM `prices` LEFT JOIN `booked` ON prices.pcode=booked.pcode
WHERE prices.pcode='A2CD59GH'
    AND (prices.date IN ('20131221', '20131228')
        AND booked.date NOT IN ('20131221', '20131222', '20131223',
        '20131224', '20131225', '20131226', '20131227', '20131228',
        '20131229', '20131230', '20131231', '20140101', '20140102',
        '20140103')
    )
    OR (prices.date IN ('20131214', '20131221')
        AND booked.date NOT IN ('20131214', '20131215', '20131216',
            '20131217',
            '20131218', '20131219', '20131220', '20131221', '20131222',
            '20131223', '20131224', '20131225', '20131226', '20131227')
    )
    OR (prices.date IN ('20131228', '20140104') AND booked.date NOT IN
        ('20131228', '20131229', '20131230', '20131231', '20140101',
        '20140102', '20140103', '20140104', '20140105', '20140106',
        '20140107', '20140108', '20140109', '20140110')
    )
GROUP BY prices.date
ORDER BY prices.date ASC

赋予查询的值...

  • 开始日期 = 20131221
  • 持续时间 = 14
  • 属性 = A2CD59GH
  • 加减号 = 1

我的问题是,即使某个范围内的某些日期出现在“bookings”表中并且 ppw 值比我预期的要多很多,此查询也会返回记录。

使用 SUM(ppw) 的原因是当指定 14 的持续时间时,价格将两个星期相加。

感谢您对此的任何帮助

【问题讨论】:

  • 也许从简单的开始,然后逐渐增加复杂性。此外,该 LEFT JOIN 呈现为 INNER JOIN。这就是你想要的吗?
  • 我希望返回给定开始日期的价格,其中该属性的预订表中没有出现持续时间中的日期。如果可能的话,如果持续时间为 14,则对价格求和,否则只返回每周的价格,我可以在使用 PHP 显示之前对总价格求和

标签: php mysql select left-join


【解决方案1】:

您的方法的问题在于,只有当给定pcodebooked 表中的每条记录 都在预订期内时,startdate 才会从结果中被过滤掉。显然,如果该物业是在其他日期预订的,情况就不会如此。

我建议按照以下方式执行反连接:

SELECT   t.date, SUM(prices.priceperweek) FROM prices JOIN (
  SELECT   prices.date
  FROM     prices LEFT JOIN booked
              ON booked.pcode = prices.pcode
             AND booked.date BETWEEN prices.date
                                 AND prices.date + INTERVAL 14 DAY
  WHERE    booked.pcode IS NULL
       AND prices.pcode = 'A2CD59GH'
       AND prices.date BETWEEN '20131221' - INTERVAL 1 WEEK
                           AND '20131221' + INTERVAL 2 WEEK
) t ON prices.date BETWEEN t.date AND t.date + INTERVAL 13 DAY
GROUP BY t.date

【讨论】:

  • 谢谢@eggyal:这在仅返回那些范围内的任何日期都没有出现在“已预订”表中的记录方面效果很好......但返回的值是 SUM(prices.priceperweek ) 远高于应有的水平。是否应该添加一些 GROUP BY 元素?
  • @DavidG:一些示例数据可能有助于说明您的问题。也许设置一个SQLfiddle
  • @DavidG:那么问题出在哪里?您预订了从 2014 年 1 月 11 日和 2014 年 1 月 4 日开始的几周,每星期的费用为 600 英镑/周,总计 1200 英镑。顺便说一句,你真的应该使用 MySQL 的 DATE 类型来存储你的日期。
  • 当我在 PhpMyAdmin 中运行相同的查询时,我得到了结果... date SUM(prices.priceperweek) 20140104 728544.00
  • @DavidG:prices 表中有一周中每一天的费率吗?或者同一家酒店可能有多种不同的费率?
猜你喜欢
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-25
相关资源
最近更新 更多