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

时间:2014-05-14 09:50:46

标签: mysql

有一条检查我不想在PHP中循环,但想让MySQL解决。不仅因为它更干净,而且因为PHP循环是noobish并且(在这种情况下)非常服务器要求看到它是一个非常大的表。

但是,我不知道从哪个查询开始(noobish,我知道)

我有两张桌子:

  1. 订单
  2. 我想查询一个工人下订单的最后几天。例如:

    工人一直致力于:

    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
    

    然后结果将是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-03
    2014-05-04
    2014-05-07
    2014-05-10
    2014-05-14
    

    这应该导致5.因为他错过了2014-05-02的订单,这打破了他的订单连胜。

    所以问题是,这在MySQL中是否可行,或者我应该继续我原来的noobish循环计划。

    注意:数据库负载实际上不是问题。

1 个答案:

答案 0 :(得分:0)

我认为这样做会:

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

LEFT JOIN导致o.date NULL只要orders中的shifts行没有匹配的行就会{{1}}。