0

我有两张桌子。一是物品。第二个是分类项目(catitems)。两个表都有一个用户字段。

我需要一个查询,按用户在第一个表(项目)中选择所有项目,但排除第二个表(catitem)中分配给给定类别的项目。换句话说,我从第一个表中获取用户的项目列表,但如果第二个表中有一行包含项目、猫和用户,我会排除该项目。

从原理上讲,这类似于 Select item FROM items where userid=1 but exclude item WHERE (in second table) (cat = "something" AND userid=1.)

我尝试了以下方法,但不排除表 2 中的项目。我做错了什么?

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

2 回答 2

1

第一的:

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

第二:。解决方案:

于 2012-04-30T14:18:56.303 回答
0

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'

微小但微妙的差异。您总是希望为用户关联“项目”(通过 where i.userid 而不是 c.userid),但条件是,您只需要不是“$cat”的类别(在连接的 ON 子句中找到)

于 2012-04-30T14:26:17.640 回答