Mysql 查询 NOT EXISTS 无法正常工作

Mysql query NOT EXISTS doesn't work properly

我有以下两个 table 和列

Table 1: transactionid

Table 2: transactionid 和 status

如果 table2

中不存在相同的事务 ID,我需要从 table 1 中获取结果

如果 table2 中存在相同的 transactionid 但状态不同于 2 那么它不应该 return table1 行

如果 table2 中存在相同的 transactionid 并且状态为 2 那么它应该 return table 1 行但是我需要知道这个所以我可以显示错误在我的网站里面

我目前有:

select * from table1 where not exists (select null from table2
            WHERE table1.transactionid = table2.transactionid AND status <> 2)

我需要这样的东西(它不能正常工作)

select *, (select count(*) from table2 where table1.transactionid = table2.transactionid AND status = 2) as orderswitherrors from table1 where not exists (select null from table2
            WHERE table1.transactionid = table2.transactionid AND status <> 2)

所以在 php 我可以检查 transactionid 在 table2 中是否有错误 if ($row->orderswithererrors > 0) ...

谢谢

我认为您尝试使用 EXISTS 太麻烦自己了。

在此查询中,我们仅使用连接将 Table1 和 Table2 都放入结果集中。我们使用左连接,这样即使表 2 中不存在表 1 中的行,也会返回这些行。如果没有匹配的行,结果集将包含所有 Table2 列的 NULL。

一旦我们得到一个包含两个表的结果集,我们就过滤那些行,这样我们只保留 a) 表 2 中没有行,或 (b) 有行和状态的行= 2.

SELECT    table1.*, 
          table2.status
FROM      table1
LEFT JOIN table2 ON table1.transactionid = table2.transactionid
WHERE     table2.transactionid IS NULL   --Doesn't exist in table2
OR        table2.status = 2              --Exists in table2 with status 2

您可以使用 'left join' 和 case 语句来获取带有状态的交易 ID,以及基于状态的 show/hide 错误,例如:

SELECT t1.transactionid, 
CASE WHEN t2.status IS NULL THEN 'NOT_EXISTS'
WHEN t2.status = 2 THEN 'ERROR'
END AS state
FROM table1 t1 LEFT JOIN table2 t2 ON t1.transactionid = t2.transactionid
WHERE t2.status IS NULL OR t2.status = 2
ORDER BY t1.transactionid;

这里是SQL Fiddle

您可以组合使用 NOT EXISTSEXISTS

select t1.*
from table1 t1
where not exists (select 1
                  from table2 t2
                  where t1.transactionid = t2.transactionid
                 ) or
      exists (select 1
              from table2 t2
              where t1.transactionid = t2.transactionid and
                    status = 2
             );