2014-09-19 52 views
0

我的數據庫有兩個表:IPS,oips獲取從SELECT語句的重複值對PHP的MySQL

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)

謝謝!

+1

使用'not in','not exists'或'left join。 。 。 where = NULL'。 – 2014-09-19 00:53:15

回答

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 
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語句每個表使用select distinct內被複制。