我需要在两个表之间运行某种异常报告。


  表格1
      登录


mysql - 两个表之间的异常报告-LMLPHP


  表2
  扫瞄


mysql - 两个表之间的异常报告-LMLPHP

现在进行“表登录”时,框将以单独的批次登录到系统,但在“扫描”中将框和批次结合在一起。

我正在尝试确定尚未扫描但已记录的盒子。

所以我写了下面的脚本,但它没有给我正确的答案,因为结果是同时记录和扫描了盒子。一些奇怪的原因?

SELECT distinct CONCAT_WS('-', box, batch) As box
FROM   login a
WHERE  a.profid = '46'
and dt between '2018/01/01 00:00:01am' and '2018/05/25 23:59:59 PM'
       AND NOT EXISTS (SELECT 1
                       FROM   scan b
                       WHERE  b.profid = '6'
                              AND a.box = b.boxname)


我要错了吗?
谢谢

最佳答案

您的查询看起来基本上还可以,只是两个表之间的连接条件看起来不对,并且根据您显示给我们的数据它不起作用。试试这个版本:

SELECT DISTINCT CONCAT_WS('-', box, batch) AS box
FROM login a
WHERE
    a.profid = '46' AND
    dt >= '2018-01-01' AND dt < '2018-05-26' AND
   NOT EXISTS (SELECT 1 FROM scan b
               WHERE b.profid = '6' AND b.boxname LIKE CONCAT('%', a.box, '%'));


我所做的关键更改是将以下条件添加到EXISTS子查询:

b.boxname LIKE CONCAT('%', a.box, '%')


例如,如果您试图将框DSDEN182与框名称DSDEN182-BATCHG77899M进行匹配,则这是有道理的。

注意:虽然上面的查询可能会起作用并暂时解除对您的阻止,但连接条件同时使用LIKE和字符串连接。这是一个非常昂贵的比较。为了获得更好的长期性能,请考虑在loginscan表上都创建适当的联接列。

07-26 06:48