MYSQL语法连接

MYSQL语法连接,mysql,join,syntax,sql-injection,pdo,Mysql,Join,Syntax,Sql Injection,Pdo,我有两张桌子。一是项目。第二种是分类项目。两个表都有一个用户字段 我需要一个查询,该查询按用户选择第一个表项中的所有项,但排除分配给给定类别的第二个表catitem中的那些项。换句话说,我从第一个表中按用户获得一个项目列表,但如果第二个表中有一行包含item、cat和user,我将排除该项目 从示意图上看,这类似于从userid=1的项目中选择项目,但排除第二个表cat=something和userid=1中的项目 我尝试了以下方法,但并不排除表2中的项目。我做错了什么 $sql = "SELE

我有两张桌子。一是项目。第二种是分类项目。两个表都有一个用户字段

我需要一个查询,该查询按用户选择第一个表项中的所有项,但排除分配给给定类别的第二个表catitem中的那些项。换句话说,我从第一个表中按用户获得一个项目列表,但如果第二个表中有一行包含item、cat和user,我将排除该项目

从示意图上看,这类似于从userid=1的项目中选择项目,但排除第二个表cat=something和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')";
第一:


第二名:。解决方案:。

左连接意味着首先列出的所有来自左侧的表,而不是右侧所需的匹配。但是,一旦在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为用户关联项目,但有条件地,您只希望在join的ON子句中找到不为“$cat”的类别

这也不排除第二个表中存在行的项目。要清楚,我不想让用户看到左表中的每个项目…我想从这些项目中排除右表中的项目。上面的查询仍然没有排除右表中的匹配项。联接似乎不适合任务,但下面的子查询工作:$sql=SELECT*FROM items,其中userid='$userid',id不在catitems中,其中userid='$userid'和tcircle='$cat';如何将第二个表中的项目与第一个表中的项目进行匹配?您能为这两个表显示“显示创建表”输出的表架构吗?
SELECT i.*
   FROM items i
           LEFT JOIN catitems c
              ON i.userid = c.userid
             AND c.tcircle != '$cat'
   WHERE 
      i.userid = '$userid'