MySQL查询,如果日期是后续的
有一个检查我不想在PHP中循环,但想让MySQL解决。不仅因为它更干净,还因为PHP循环是noobish,在本例中,服务器要求看到它是一个相当大的表 然而,我不知道从哪里开始这个查询noobish,我知道 我有两张桌子: 转移 命令 我想查询工人下订单后的最大天数。例如: 工人从事过以下工作:MySQL查询,如果日期是后续的,mysql,Mysql,有一个检查我不想在PHP中循环,但想让MySQL解决。不仅因为它更干净,还因为PHP循环是noobish,在本例中,服务器要求看到它是一个相当大的表 然而,我不知道从哪里开始这个查询noobish,我知道 我有两张桌子: 转移 命令 我想查询工人下订单后的最大天数。例如: 工人从事过以下工作: 2014-05-01 2014-05-02 2014-05-03 2014-05-04 2014-05-07 2014-05-10 2014-05-14 2014-05-01 2014-05-02 20
2014-05-01
2014-05-02
2014-05-03
2014-05-04
2014-05-07
2014-05-10
2014-05-14
2014-05-01
2014-05-02
2014-05-03
2014-05-04
2014-05-07
2014-05-10
2014-05-14
订单是在:
2014-05-01
2014-05-02
2014-05-03
2014-05-04
2014-05-07
2014-05-10
2014-05-14
2014-05-01
2014-05-03
2014-05-04
2014-05-07
2014-05-10
2014-05-14
那么结果是7。因为每天至少有一份订单。我们希望每天都有订单。我们不在乎每天有多少订单,我们只想知道他至少有一份订单
现在是第二个例子
工人从事过以下工作:
2014-05-01
2014-05-02
2014-05-03
2014-05-04
2014-05-07
2014-05-10
2014-05-14
2014-05-01
2014-05-02
2014-05-03
2014-05-04
2014-05-07
2014-05-10
2014-05-14
订单是在:
2014-05-01
2014-05-02
2014-05-03
2014-05-04
2014-05-07
2014-05-10
2014-05-14
2014-05-01
2014-05-03
2014-05-04
2014-05-07
2014-05-10
2014-05-14
这将导致5。因为他错过了2014-05-02的订单,这打破了他的订单记录
所以问题是,这在MySQL中是可能的,还是我应该继续我最初的noobish循环计划
注意:数据库负载不是一个真正的问题。我认为这样做可以:
SELECT worker_id, MAX(counter) AS max_days
FROM (
SELECT worker_id,
@counter := IF(o.date IS NULL, 0,
IF(worker_id != @prev_worker, 1,
@counter + 1)) AS counter,
@prev_worker := worker_id
FROM (
SELECT DISTINCT s.worker_id, s.date, o.date
FROM shifts AS s
LEFT JOIN orders AS o ON s.worker_id = o.worker_id AND s.date = o.date
ORDER BY s.worker_id, s.date) AS j
CROSS JOIN (SELECT @counter := 0, @prev_worker := null) AS vars) AS w
GROUP BY worker_id
每当轮班的订单中没有匹配的行时,左连接会导致o.date为NULL。我想,要解决这个问题,您必须左连接到订单上。您可以检查不匹配的订单,按日期分组以删除重复的订单。在这之后,我不确定,可能使用组\u concatIFOrderId为NULL,'f',t'按WorkingDate进行聚合,并使用贪婪的regexp匹配字符串't'来查找最长的匹配?通过不使用循环可以获得一些显著的优化,这是您的计数器在SQL中模拟的,您已经有效地将开始时的多线程搜索转变为对数据库中每一天/工作人员的线性扫描。他希望计算符合条件的连续行数。我不知道如何在没有循环的情况下做到这一点。MySQL没有行数函数,所以没有其他好的方法来测试邻接。