2017-04-24 78 views
0

我有以下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

不要混合显式和隐式'JOIN'查询 - 相反,您应该始终使用显式连接。 – Dai

+1

'article'和'activity'之间的关系是什么?如果查询之间没有定义的JOIN条件,查询就没有意义了。现在你的查询没有一个。 – Dai

回答

3

请勿将旧学校逗号操作符的语法用于连接操作和新的JOIN关键字语法混合使用。

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

另外,在WHERE子句中需要用于从activitycontent (即activitycontent.languageID = 'no')的列的非空值的谓词否定LEFT的outerness 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 

没有一个实际的,具体的规格(最好包括示例数据和预期结果),我们留下猜测应该由该查询返回的结果是什么。

只是不可能建议一个查询,它会返回我们之后的结果......如果我们不知道我们在做什么后。

+0

查询的要点是循环浏览2个不同表格中的内容 - 文章和活动 - 它们应该混合在一起。还有一件事是sortDate,我现在得到的是'Column'sortDate'中的order子句是不明确的 - 这是我没有在我的问题中指出的另一个问题,但已经知道会弹出 - 是否有办法处理接着就,随即? – Xeen

+0

我打算在查询中提及符合条件的* all *列引用。前缀'sortDate'与表的名称一样,就像其他列引用被限定一样。例如'ORDER BY article.sortDate'。如果意图产生交叉产品,那么删除'ON 1 = 1'并添加关键字'CROSS'作为对未来读者/维护者的帮助... **'从文章CROSS JOIN活动**。 (CROSS关键字在MySQL中是可选的,不会影响结果,其他数据库在省略ON子句时需要关键字。) – spencer7593

+0

没有更具体的规范(最好包括示例数据和预期结果集),它不是可能建议查询。看看我的答案中的查询,那些LEFT JOIN操作看起来毫无意义,它们只会用于返回重复行。 – spencer7593

0

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

这种“修复”查询:

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; 

我不相信,这确实有用的东西。