8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

mysql ...in where 子句有歧义

Chris Maurer 2月前

27 0

SELECT cat.CategoryID as CategoryID, count(p.ProductID) as CountProducts FROM Category as cat LEFT JOIN Products as p on p.

SELECT
                cat.CategoryID as CategoryID,
                count(p.ProductID) as CountProducts
            FROM 
                Category as cat
                LEFT JOIN Products as p on p.CategoryID IN 
                       (SELECT CategoryID FROM Category as cd 
                           WHERE cd.ParrentCategoryID = '876')
            WHERE 
                CategoryID = '876'
            ORDER by Name

我们收到错误 — “where 子句中的列‘CategoryID’不明确”。

请告诉我怎样才正确?

帖子版权声明 1、本帖标题:mysql ...in where 子句有歧义
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Chris Maurer在本站《authentication》版块原创发布, 转载请注明出处!
最新回复 (0)
  • CategoryID 在两个表中都有。用表名来命名标识符列不是一个好主意 - 只需

  • 您收到的错误告诉您 CategoryID 中的 WHERE 不明确,这意味着系统无法识别适当的列,因为有多个 CategoryID 列。

    为了解决这个问题,请使用别名来指定你想要在 WHERE 子句中使用的列:

    SELECT cat2.CategoryID AS CategoryID
        ,cat2.Name AS CategoryName
        ,COUNT(p.ProductID) AS CountProducts
    FROM Category AS cat
    INNER JOIN Category AS cat2 ON cat2.ParrentCategoryID = cat.CategoryID
    INNER JOIN Products AS p ON p.CategoryID = cat2.CategoryID
    WHERE cat.CategoryID = '876'
    GROUP BY cat2.CategoryID, cat2.Name
    ORDER BY cat2.Name
    

    我也改变了一些查询以获得相同的结果,但我没有使用 LEFT JOIN + IN 子句 + 子查询的组合,而是使用了 INNER JOIN 子句。使用此查询,您只需定义 CategoryID 一次所需的查询,它就会自动获取每个子类别。

    我不确定您的查询是否正确运行,因为您使用该 COUNT 函数时没有按结果进行分组 CategoryID ......

    希望这对你有帮助。

  • +1。这是查询的更常见模式;ON 子句中的谓词引用 FROM 子句中的表的列(与 OP 查询中的 IN(子查询)相对)。

  • @learner 如果你从中学到了一些东西,那就很高兴了,小错误也是开发人员生活的一部分;-) 不要忘记将其中一个答案标记为“已接受”,以便关闭问题

  • vam 2月前 0 只看Ta
    引用 6

    \' 模棱两可的列 \' 错误意味着对列标识符有一个引用,并且 MySQL 有两个(或更多)可能的列符合规范。

    句中列 CategoryID 的引用 WHERE

    是指 CategoryID 来自的列 CategoryID ,或是指 cat 来自的列 CategoryID ,这是\'模棱两可\'的 p .

    解决方法是使用 引用 以消除歧义。也就是说,代替 Categ或yID ,指定 cat.CategoryID or p.CategoryID .


    一些补充说明:

    IN (subquery) 有一个谓词是非常奇怪的 ON 。如果 CategoryID 不能保证在 Category 表中是唯一的,则此查询可能会生成比预期更多的行。

    此类查询的正常模式类似于:

    SELECT cat.CategoryID     AS CategoryID
         , COUNT(p.ProductID) AS CountProducts
      FROM Category cat
      LEFT 
      JOIN Products p
        ON p.CategoryID = cat.CategoryID 
     WHERE cat.ParrentCategoryID = '876'
     ORDER BY cat.Name
    

    通常,子句中的连接谓词 ON 引用 FROM 子句中两个(或更多)表中的列。(这不是 SQL 要求。这只是通常的模式。)

    中的谓词指定 ON (Category) 表 CategoryID 中的列 cat 的值 (Product) 表 中的列 CategoryID 的值 p 匹配

    此外,最佳做法是 使用表的名称或表别名来限定查询中引用的 所有 Name 中的列 ORDER BY

    这样做的一个很大的好处是,如果(在未来的某个时间)将一个名为的列 Name 添加到 Products 表中,则带有未限定引用的查询 Name 将开始针对该引用抛出“不明确的列”错误。因此,限定所有列名可避免在将新列添加到现有表时导致工作查询“中断”。

    另一个很大的好处是,对于语句的读者来说。MySQL 可以非常快速地在字典中查找该列在哪个表 Name 中。但是,如果 SQL 语句的读者(比如我自己)不知道哪个表包含名为的列 Name ,则还需要查看表定义才能找到答案。如果名称符合条件,我们就已经知道该列来自哪个表。

  • 尝试 WHERE cat.CategoryID = '876'

返回
作者最近主题: