【问题标题】:Joining multiple tables but not all加入多个表但不是全部
【发布时间】:2015-11-02 07:34:41
【问题描述】:

我想加入基于 Table1 (product) 和 Table3 (system_type) 的结果。而 Table2 (system_cat) 不包括我想加入的列。 如何将 Table1 和 Table2 连接起来,但只能在一个语句中连接 Table1 和 Table3?

当前未加入的版本:

 SELECT * FROM product LEFT JOIN system_cat USING (cat_id) LEFT JOIN system_type USING (type_id) WHERE system_furniture_check = 0 AND cat_id = :c ORDER BY sortorder

加入非工作版本(尝试1):

 SELECT * FROM product LEFT JOIN system_cat USING (cat_id) LEFT JOIN system_type USING (type_id) WHERE system_furniture_check = 0 AND cat_id = :c ORDER BY sortorder 

替代加入的非工作版本(尝试 2):

SELECT product.*, system_cat.*, system_type.* 
FROM product 
JOIN system_cat 
ON system_cat.cat_id = product.cat_id 
JOIN system_type 
ON system_type.type_id = product.type_id 
WHERE system_furniture_check = 0 AND cat_id = :c ORDER BY sortorder

错误:

带有消息“SQLSTATE[23000]”的未捕获异常“PDOException”:违反完整性约束:where 子句中的 1052 列“cat_id”不明确

表格:

  • 产品 – type_id, cat_id
  • system_cat – cat_id
  • system_type – type_id, cat_id

【问题讨论】:

  • 您需要在 where 子句中的cat_id 之前添加一个表名(或别名)
  • 错误提示您必须指定cat_id 的表。看看你在哪里使用cat_id 并注意添加一个表格,我会工作得很好

标签: php mysql sql join pdo


【解决方案1】:

您需要在 where 子句中的 cat_id 之前添加一个表名(或别名)。
使用下面修改后的查询,替换 ????使用您要使用的表名。

SELECT product.*, system_cat.*, system_type.* 
FROM product 
JOIN system_cat USING (cat_id)
JOIN system_type USING (type_id)
WHERE system_furniture_check = 0 
AND ????.cat_id = :c 
ORDER BY sortorder

如果要匹配的列名称相同,也可以使用“USING”。

【讨论】:

  • 虽然@Madhivana 先到了那里,但我确实喜欢这个答案背后的简单性。谢谢。
【解决方案2】:

试试这个,你错过了表格的限定符:

SELECT p, sc, st 
FROM product p
INNER JOIN system_cat sc
ON sc.cat_id = p.cat_id
INNER JOIN system_type st
ON st.type_id = p.type_id 
WHERE system_furniture_check = 0 AND sc.cat_id = :c ORDER BY sortorder;

【讨论】:

    【解决方案3】:

    正如它所说,您需要为表限定符添加前缀。尝试这个。也不要使用*,只需输入所需的列

    SELECT product.*, system_cat.*, system_type.* 
    FROM product 
    JOIN system_cat 
    ON system_cat.cat_id = product.cat_id 
    JOIN system_type 
    ON system_type.type_id = product.type_id 
    WHERE system_furniture_check = 0 AND system_cat.cat_id = :c ORDER BY sortorder
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-01
      • 2012-11-19
      • 2019-09-23
      • 2012-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-25
      相关资源
      最近更新 更多