我有一个结构表
id | item | order_date | delivery_date
我有一系列日期,例如
$dates = array('2015-06-01', '2015-06-11', '2015-06-26');
我需要做的是找到订购但未在每个日期交付的商品数量。由于我的代码复杂性,不可能预先计算数组并分别搜索每个日期。
有一个我认为查询应该是什么样子的例子,但我开始想知道是否有可能让它以这种方式工作(没有预先约定每个日期)。
SELECT SUM(id) FROM orders WHERE order_date > IN({implode(",", $dates)}) AND delivery_date < IN ({implode(",", $dates)}) GROUP BY ???
注意:我想在一个数组中给出每个日期的GROUP BY。
答案 0 :(得分:1)
使用返回数组中所有日期的子查询。然后您可以加入,并在GROUP BY
。
$subquery = implode(' UNION ', array_map(function($d) {
return "SELECT '$d' AS date";
}, $d));
$query = "SELECT d.date, SUM(id)
FROM orders
JOIN ($subquery) AS d ON d.date BETWEEN order_date AND delivery_date
GROUP BY d.date";
请注意,如果订单与多个日期匹配,则会计算每个日期。