Mysql查询NOT EXISTS无法正常工作

时间:2017-01-20 23:54:02

标签: mysql sql database not-exists

我有以下两个表和列

表1:transactionid

表2:transactionid和status

如果table2中不存在相同的transactionid,我需要从表1中获得结果

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

如果table2中存在相同的transactionid且状态为2,那么它应该返回表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中我可以检查tableid2中的transactionid是否有错误($ row-&gt; orderswitherrors&gt; 0)......

谢谢

3 个答案:

答案 0 :(得分:2)

您可以使用'left join'和case语句来获取状态的事务ID,并根据状态显示/隐藏错误,例如:

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

答案 1 :(得分:1)

我认为你试图使用EXISTS会让自己烦恼不已。

在此查询中,我们只使用连接将Table1和Table2都放入结果集中。我们使用左连接,因此即使Table2中不存在Table1中的行,也会返回它们。如果没有匹配的行,则结果集将包含所有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

答案 2 :(得分:0)

您可以组合使用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
             );