2012-02-15 35 views
-1

我有兩個表和foreign_key索引表: 表xymply_locations ID 名 緯度 LNG如何正確使用JOIN?

table xymply_categories 
id 
name 

table xymply_categoryf_key 
locid 
catid 

,我想選擇分配給LOCID 1.我如何做到這一點的類別,我試過

SELECT * 
FROM `xymply_categoryf_key`, xymply_categories 
JOIN `xymply_categories` ON 
     xymply_categories.id = xymply_categoryf_key.catid 
WHERE locid = 1; 

但我得到"Not unique table/alias: 'xymply_categories' ",我想知道爲什麼......?

+0

你實際上會做兩個連接,一個隱含兩個'from'表,一個顯式連接'join'。所以你有xymply_categories包括兩次,導致你的錯誤。 – 2012-02-15 21:18:58

回答

2

您在代碼中混合了隱式(FROM子句中列出的所有表)和顯式JOIN樣式,因此是錯誤。

SELECT xc.id, xc.name 
    FROM xymply_categories xc 
     INNER JOIN xymply_categoryf_key xck 
      ON xc.id = xck.catid 
    WHERE xck.locid = 1; 
0

因爲你是如此的分貝要以知道選擇列時候去到一個表的別名「加入」 xymply_catagories兩次。

根據您的需要,您可以採用幾種方法。直內連接(這似乎是你想要的)可以

select * from xymply_categoryf_key a, xymply_categories b where a.catid = b.id 
WHERE b.locid = 1; 

,或者你也可以做一個明確的內部聯接爲喬·斯特凡內利表示。這兩種方法都可以爲您提供每張表中匹配信息的記錄。

1

在您的查詢中,您正在從兩個表中進行選擇。其中一個是xymply_categoryf_key,另一個是xymply_categories兩個實例的JOIN。您正在使用同一個表的兩個實例,因此當您編寫xymply_categories.id時,您不清楚您指的是哪個實例 - 第一個參數是JOIN,還是第二個參數?這就是"Not unique table/alias"的含義。如果我理解正確,你想要做什麼,試試這個:

SELECT c.id, c.name FROM xymply_categories c, xymply_categoryf_key k WHERE c.id = k.catid AND k.locid = 1; 

這是沒有做JOIN,雖然

WHERE c.id = k.catid 

評價也許將與JOIN快,我不知道。此外,請注意kc作爲表xymply_categoryf_key(關鍵爲k)和xymply_categories c(類別爲c)的別名的用法。這是如何避免之前發生的「非唯一表/別名」問題。就你而言,你可以使用例如

xymply_categories a JOIN xymply_categories b WHERE a.id = ... 

所以,雖然我舉了一個例子如何編寫查詢,而無需使用JOIN - 正如我所說,使用JOIN可能會產生更快的查詢。因此,你應該做的就是添加別名。