'on子句'中的未知列

时间:2017-04-24 22:21:23

标签: mysql sql

我有以下SQL查询:

SELECT
    article.*,
    activity.*
FROM
    article,
    activity
    LEFT JOIN articlecontent ON article.id = articlecontent.articleID
    LEFT JOIN activitycontent ON activity.id = activitycontent.activityID 
WHERE
    articlecontent.languageID = 'no'
    AND
    activitycontent.languageID = 'no' 
ORDER BY
    sortDate DESC 
LIMIT 3

返回以下错误:#1054 - Unknown column 'article.id' in 'on clause'

我该怎么做才能解决它?

2 个答案:

答案 0 :(得分:3)

不要将连接操作的旧学校逗号运算符语法与较新的JOIN关键字语法混合使用。

似乎没有链接articleactivity的条件。因此,查询将生成交叉产品(笛卡尔积)... article中的每一行都将与activity中的每一行匹配。如果这是所需的集合,我们可以添加CROSS关键字作为未来读者的文档。否则,添加一些条件。

此外,WHERE子句中的谓词需要来自activitycontent的列的非空值 (即activitycontent.languageID = 'no')否定LEFT JOIN的外部性,使其等同于INNER JOIN。 (在WHERE子句中使用该条件,然后省略LEFT关键字将不会更改结果。)如果我们需要外连接,我们可以将该谓词重定位到外连接的ON子句。)

SELECT article.*
     , activity.*
  FROM article
  JOIN activity
    ON 1=1       -- condition that links article to activity should go here
  LEFT
  JOIN articlecontent
    ON articlecontent.articleID = article.id
   AND articlecontent.languageID = 'no'
  LEFT
  JOIN activitycontent
    ON activitycontent.activityID = activity.id
   AND activitycontent.languageID = 'no'
 ORDER BY article.sortDate DESC
 LIMIT 3

<强>后续

在我的回答中查看查询,外部连接到activitycontent表和articlecontent表看起来毫无意义。这些只会产生重复的行。如果目的是限制返回的行,那么通过删除LEFT关键字将它们变为INNER JOIN。

SELECT article.*
     , activity.*
  FROM article
 CROSS
  JOIN activity
  JOIN articlecontent
    ON articlecontent.articleID = article.id
   AND articlecontent.languageID = 'no'
  JOIN activitycontent
    ON activitycontent.activityID = activity.id
   AND activitycontent.languageID = 'no'
 ORDER BY article.sortDate DESC
 LIMIT 3

如果没有实际的具体规范(最好包括示例数据和预期结果),我们就会猜测查询应该返回什么结果。

我们不可能建议一个会返回我们所追求的结果的查询......如果我们不知道我们的结果是什么。

答案 1 :(得分:0)

您的查询毫无意义。除了逗号之外,left joinwhere子句转换为内连接。然后,您从前两个表中进行选择 - 左连接将选择所有没有过滤的行。

这&#34;修复&#34;查询:

SELECT article.*, activity.*
FROM article CROSS JOIN
     activity INNER JOIN
     articlecontent
     ON article.id = articlecontent.articleID INNER JOIN
     activitycontent
     ON activity.id = activitycontent.activityID 
WHERE articlecontent.languageID = 'no' AND
      activitycontent.languageID = 'no' 
ORDER BY sortDate DESC 
LIMIT 3;

我不相信这会有用。