mysql - 'on clause' 中的未知列

标签 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 - “on 子句”中的未知列“article.id”

我能做些什么来修复它?

最佳答案

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

似乎没有任何条件可以链接 articleactivity。因此查询将生成叉积(笛卡尔积)...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/

相关文章:

mysql - Django 与远程 MySQL

php - MySQL select 可以故意选择部分参数吗?

mysql - 使用存储过程或函数遍历一个表并替换另一个表中的值

php - SQL-根据列表顺序对项目进行排序

sql - 快速获取 MySQL 中 2 列差异的方法

mysql - C 程序和 Ruby on Rails 应用程序之间传递数据的方式

sql - 在 PostgreSQL 中创建一定长度的索引时用双括号

sql - 当数据包含逗号时将 sql 假脱机为 CSV

mysql - sql - FK 的多行插入

php - 检测触发数组中增量编号更改的记录