有一条检查我不想在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
然后结果将是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循环计划。
注意:数据库负载实际上不是问题。
答案 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}}。