MySQL查询,如果日期是后续的

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

有一个检查我不想在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
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没有行数函数,所以没有其他好的方法来测试邻接。