首先,我很抱歉这种格式。这是我的第一次,我真的不知道如何在这里展示表格。
这是我的语法:
SELECT order.id, order.begin, order.end, report.id,
DATE_FORMAT( report.add_date, '%Y-%m-%d' ) AS report_add_date, sums.id, sums.qty
FROM order, report, sums
WHERE (report.add_date BETWEEN order.begin AND order.end)
AND (report.id = sums.id)
ORDER BY order.id ASC
它给出了以下结果:
order.id | order.begin | order.end | report.id | report.add_date | sums.id | sums.qty
255 | 2013-10-21 | 2013-10-22 | 390 | 2013-10-21 | 390 | 250
256 | 2013-10-22 | 2013-10-23 | 393 | 2013-10-22 | 393 | 385
最终结果应如下所示:
order.id | order.begin | order.end | report.id | report.add_date | sums.id | sums.qty
255 | 2013-10-21 | 2013-10-22 | 390 | 2013-10-21 | 390 | 250
255 | 2013-10-21 | 2013-10-22 | 393 | 2013-10-22 | 393 | 385
256 | 2013-10-22 | 2013-10-23 | 393 | 2013-10-22 | 393 | 385
希望您能看到,我正在尝试为所有order.id获取所有sums.qty,其中report.add_date位于order.begin和order.end日期之间。
有3个表:订单,报告和总和。 订单包含范围日期(开始 - 结束)。报告包含日期(add_date)。 Sums包含qty,它与id by Report。相关。
Order.id 255应该获得2013-10-21和2013-10-22之间日期的所有sums.qty。
Order.id 256应该获得2013-10-22和2013-10-23之间日期的所有sums.qty。
第一个没有获得2013-10-22日期的sums.qty,因为这个是后者。
据我所知,它不重复行,因此它只显示每一行。因此,当以下order.id以前一个结束日期开始时,它会停止将report.id分配给之前的order.id。
我做错了什么?提前谢谢!
答案 0 :(得分:1)
我猜add_date
是DATETIME
,而您未在DATE
条件中将其转换为BETWEEN
。日期有0时间,因此虽然BETWEEN
包含{{1}},但如果附加非零时间部分则不包括相同的日期。
我还建议切换到显式连接,因为隐式连接已被弃用了很长时间。