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 EXISTS
和 EXISTS
:
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
);
我有以下两个 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 EXISTS
和 EXISTS
:
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
);