我有以下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'
我该怎么做才能解决它?
答案 0 :(得分:3)
不要将连接操作的旧学校逗号运算符语法与较新的JOIN关键字语法混合使用。
似乎没有链接article
和activity
的条件。因此,查询将生成交叉产品(笛卡尔积)... 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 join
由where
子句转换为内连接。然后,您从前两个表中进行选择 - 左连接将选择所有没有过滤的行。
这&#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;
我不相信这会有用。