2012-04-30 44 views
0

我有兩個表。一個是項目。第二個是按類別分類的項目(小貓)。兩個表都有一個用戶字段。MYSQL SYNTAX JOIN

我需要一個查詢,用於在第一個表(項目)中選擇用戶的所有項目,但不包括分配給給定類別的第二個表格(catitem)中的項目。換句話說,我從第一個表中獲取用戶的項目列表,但是如果第二個表中有一個包含item,cat和user的行,我將排除該項目。

示意這將是像從項目選擇項目其中userid = 1,但不包括項目WHERE(在第二個表)(貓=「東西」和用戶ID = 1)。

我試過以下,但它不排除表2中的項目。我在做什麼錯了?

$sql = "SELECT i.* 
FROM `items` i 
LEFT JOIN `catitems` c 
ON i.userid = c.userid 
WHERE (c.userid = '$userid' && c.tcircle != '$cat')"; 
+0

你如何將第二個表中的項目與第一個中的項目匹配?你可以爲兩個表顯示你的表模式(SHOW CREATE TABLE的輸出)嗎? – eggyal

回答

1

第一:

$sql = "SELECT i.* 
FROM `items` i 
LEFT JOIN `catitems` c 
ON i.userid = c.userid 
WHERE c.userid = '$userid' 
AND c.tcircle != '$cat'"; 

二:。解決方案:

+0

這也不排除第二個表中存在行的項目。 – user1260310

0

A LEFT JOIN表示左側表(首先列出的表)與右側所需的匹配。但是,一旦在WHERE子句中應用了右側表格,它在技術上將它強制爲內部聯接。因此,要解決你的需求,你需要移動與其他表對應的ON子句及其相關的「條件」 ......

SELECT i.* 
    FROM items i 
      LEFT JOIN catitems c 
       ON i.userid = c.userid 
      AND c.tcircle != '$cat' 
    WHERE 
     i.userid = '$userid' 

小,但細微的差別。您總是希望爲用戶關聯的「ITEM」(通過where i.userid而不是c.userid),但CONDITIONLLY,您只需要不是'$ cat'的類別(在連接的ON子句中找到)

+0

要清楚,我不希望每個項目在左表中爲用戶...我想排除這些項目,在右表中找到項目。上面的查詢仍然不排除右表中的匹配。 – user1260310

+0

連接似乎不太適合任務,但在使用子查詢後工作:$ sql =「SELECT * FROM items WHERE userid ='$ userid'AND id NOT IN(SELECT itemid FROM catitems WHERE userid ='$ userid'AND tcircle ='$ cat')「; – user1260310