我有以下 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 - “on 子句”中的未知列“article.id”
我能做些什么来修复它?
最佳答案
不要将连接操作的旧式逗号运算符语法与较新的 JOIN 关键字语法混合使用。
似乎没有任何条件可以链接 article
和 activity
。因此查询将生成叉积(笛卡尔积)...article
中的每一行都将与 activity
中的每一行相匹配。如果这是所需的集合,我们可以添加 CROSS
关键字作为 future 读者的文档。否则,添加一些条件。
此外,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
如果没有实际、具体的规范(最好包括示例数据和预期结果),我们只能猜测查询应该返回什么结果。
如果我们不知道我们想要的结果是什么,就不可能提出一个将返回我们想要的结果的查询。
关于mysql - 'on clause' 中的未知列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43598619/