【问题标题】:Mysql - Compare array elements with field valueMysql - 将数组元素与字段值进行比较
【发布时间】:2015-07-31 09:46:22
【问题描述】:

我有一个结构表

id | item | order_date | delivery_date

我有一个日期数组,例如

$dates = array('2015-06-01', '2015-06-11', '2015-06-26');

我需要做的是查找每个日期已订购但尚未交付的物品的数量。由于我的代码复杂,不可能foreach数组,分别搜索每个日期。

有一个我认为查询应该是什么样子的示例,但我开始想知道是否有可能使它以这种方式工作(无需 foreaching 每个日期)。

SELECT SUM(id) FROM orders WHERE order_date > IN({implode(",", $dates)}) AND delivery_date < IN ({implode(",", $dates)}) GROUP BY ???

注意:我想对数组中给定的每个日期进行 GROUP BY。

【问题讨论】:

  • 是的,我知道,这只是一个更清楚地解释我的问题的例子。我会查找已填写 delivery_date 的较旧条目,例如 order_date = 2015-04-30 AND delivery_date = 2015-05-05(这是我的问题中给出的日期数组的示例)
  • 对不起,我能解释清楚了
  • 你需要的是$dates[0] BETWEEN order_date AND delivery_date OR $dates[1] BETWEEN order_date AND delivery_date OR $dates[2] BETWEEN order_date AND delivery_date
  • 谢谢@Barmar!但我发现只有临时表才能帮助我达到我的预期。

标签: php mysql arrays mysqli


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

请注意,如果订单匹配多个日期,则会针对每个日期进行计数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    相关资源
    最近更新 更多