2012-11-05 37 views
0

我試圖找到三個表中的任何一個IP地址的匹配,但我的查詢告訴我我看的列是不明確的?MySql在三個表中的任何一箇中找到匹配?

SELECT COUNT(*) 
FROM `zz_tview`,`zz_tview1`,`zz_tview3` 
WHERE `ipaddress` ="192.168.01.01" 

所以我得到「在where子句是不明確的列‘ip地址’」這條消息,我將如何構建,首先這所以它的工作原理,其次這樣的查詢是不是太沉重的表有幾千條行?

+0

您可能對以下問答感興趣:[在MySQL中存儲IP地址的最有效方式](http://stackoverflow.com/q/2542011/367456) – hakre

回答

2

聽起來像是你想這樣,但是這將會產生一個笛卡爾結果這是最有可能不是你想要的結果:

SELECT COUNT(*) 
FROM `zz_tview`,`zz_tview1`,`zz_tview3` 
WHERE `zz_tview`.`ipaddress` ="192.168.01.01" 
    OR `zz_tview1`.`ipaddress` ="192.168.01.01" 
    OR `zz_tview3`.`ipaddress` ="192.168.01.01" 

你真的應該構建以此爲JOIN

SELECT COUNT(*) 
FROM `zz_tview` v 
INNER JOIN `zz_tview1` v1 
    ON v.id = v1.id --- use the column that would join these values 
INNER JOIN `zz_tview3` v3 
    ON v.id = v3.id --- use the column that would join these values 
WHERE v.`ipaddress` ="192.168.01.01" 
     OR v1.`ipaddress` ="192.168.01.01" 
     OR v3.`ipaddress` ="192.168.01.01" 

如果你沒有辦法JOIN表,那麼你可以使用類似這樣:

select sum(total) 
from 
(
    SELECT count(*) as `total` 
    FROM `zz_tview` v 
    where v.`ipaddress` ="192.168.01.01" 
    union all 
    SELECT count(*) as `total` 
    FROM `zz_tview1` v1 
    where v1.`ipaddress` ="192.168.01.01" 
    union all 
    SELECT count(*) as `total` 
    FROM `zz_tview3` v3 
    where v3.`ipaddress` ="192.168.01.01" 
) src 
+0

這不會返回正確的結果。 – Jeshurun

+0

@Jeshurun我知道這就是爲什麼我添加了第二個版本的警告,即初始版本會產生笛卡爾產品。 – Taryn

+0

是的,第二種方法是正確的,你真的應該刪除第一種方式,因爲它不會返回正確的計數。 – Jeshurun

相關問題