【问题标题】:mysql SELECT FROM two tables and LEFT JOINmysql 从两个表中选择并左连接
【发布时间】:2014-01-27 19:04:47
【问题描述】:

我从两个表中选择并左连接到第三个时遇到问题。查询:

SELECT 
    c.id AS currency, u.user, us.enabled AS currency 
FROM 
    users AS u, 
    currency AS c
    LEFT JOIN users_settings AS us ON(c.id=us.currency, u.user=us.user)
WHERE 
    c.off=0 AND c.disabled=0 AND c.status=1 

错误:

#1054 - “字段列表”中的未知列“u.user”

我需要用户和货币的笛卡尔积。 用户:id、login、email、pass

http://en.wikipedia.org/wiki/Cartesian_product

【问题讨论】:

  • 你能告诉我们用户表吗?
  • 不要使用逗号连接语法,在你真正知道自己在做什么之前,绝对不要将逗号连接和显式连接语法混合在一起。
  • 我需要用户和货币的笛卡尔积。用户:id, login, email, pass en.wikipedia.org/wiki/Cartesian_product

标签: mysql sql


【解决方案1】:

您正在混合显式和隐式连接语法。试试这个:

SELECT c.id AS currency, u.user, us.enabled AS currency
FROM currency AS c LEFT JOIN
     users_settings AS us
     ON c.id = us.currency LEFT JOIN
     users u
     on u.user = us.user
WHERE c.off = 0 AND c.disabled = 0 AND c.status = 1 ;

MySQL 不一定允许通过, 知道字段。范围是,cross join 之间的区别之一。但是,无论如何,您应该为每个 join 使用单独的 on 子句。

这是documentation中的描述:

INNER JOIN 和 ,(逗号)在没有 一个连接条件:两者都产生一个笛卡尔积 指定的表(即第一个表中的每一行都是 连接到第二个表中的每一行)。

但是,逗号运算符的优先级低于 INNER JOIN、CROSS JOIN、LEFT JOIN 等等。如果您将逗号连接与 当存在连接条件时,其他连接类型的错误 可能会出现“on 子句”中的“未知列”“col_name”。信息 关于如何处理这个问题在本节后面给出。

与其试图真正理解这意味着什么,不如避免在from 子句中使用,。它从来都不需要。

【讨论】:

  • 谢谢,但这不是笛卡尔积en.wikipedia.org/wiki/Cartesian_product
  • @Sannin 。 . .除了范围规则之外,, 在语义上等同于 cross join。两者都无需额外过滤即可创建笛卡尔积。不过,重点是使用 , 的语法会导致查询出现问题。
  • 确认@GordonLinoff 回复。而是将from tableA, tableB, tableC 替换为多个左连接from tableA left join tableB left join tableC
猜你喜欢
  • 2020-12-07
  • 2018-03-30
  • 2023-03-03
  • 2013-10-11
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
  • 2015-06-19
  • 1970-01-01
相关资源
最近更新 更多