我的数据库有两个表:ips,oips
ips.public字段包含值:1,2,3,4,5,6,7,8
oips.public字段包含值:1,3,7
我想选择ips.public中未出现在oips.public
中的所有值我在PHP中使用以下MySQL查询:
SELECT * FROM ips, oips WHERE ips_ips.public != oips.public
这将返回以下内容:
1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8
正如您所看到的,两个表中存在的值仅显示两次,而其他所有值都显示三次(可能是由于这两个表上的迭代)。
请有人详细说明如何使用此代码,以便它只返回两个表中都没有的值(又名:2,4,5,6,8)
谢谢!
答案 0 :(得分:0)
有几种方法可以做到这一点。
我更喜欢使用NOT EXISTS
:
SELECT *
FROM ips i
WHERE NOT EXISTS (
SELECT 1
FROM oips o
WHERE i.ipublic = o.opublic)
此处NOT IN
:
SELECT *
FROM ips
WHERE ipublic NOT IN (SELECT opublic FROM oips)
这里LEFT JOIN/NULL
:
SELECT i.*
FROM ips i
LEFT JOIN opublic o ON i.ipublic = o.opublic
WHERE o.opublic IS NULL
答案 1 :(得分:0)
“仅返回不在两个表中的值”与“ips.public中未出现在oips.public中的所有值”不同
下面的查询将显示两个表中都没有的所有公共值。
select public from (
select public from ips
union all
select public from oips
) t1 group by public
having count(*) = 1
如果public
可以在每个表中重复,请使用select distinct
作为内部选择语句。