【问题标题】:MySQL - SELECT with LEFT JOIN optimizationMySQL - 带有 LEFT JOIN 优化的 SELECT
【发布时间】:2026-02-20 00:10:02
【问题描述】:

我有 3 张桌子可供选择。其中 2 个始终是必需的(tbl_notestbl_clients),而第 3 个是可选的(tbl_notes_categories)。

我一直在查询中使用LEFT JOIN 与主表相关的可疑记录。

但我没有得到以下查询的任何结果。

有人能指出我如何错误地使用 LEFT JOIN 吗?

SELECT n.*, c.clientname, nc.notecategoryname 
FROM tbl_notes n, tbl_clients c 
LEFT JOIN tbl_notes_categories nc ON n.categoryid = nc.categoryid 
WHERE n.clientid = c.clientid 
AND c.clientid = 12345 
ORDER BY n.dateinserted DESC

事实上,我遇到了一个 sql 错误。 #1054 - 'on Clause' 中的未知列 'n.categoryid'

categoryid 确实存在于tbl_notes

我可能需要重新了解 JOINS 的真正工作原理。我猜我之前不能有 2 个数据库表的 LEFT JOIN?

顺便说一句,我可以预见会有多个必填表和几个可选表。 (在这种情况下tbl_notes_categories 是可选的)

【问题讨论】:

  • 尝试将tbl_notestbl_clients 之间的隐式连接转换为显式INNER JOIN。无论如何,这就是幕后发生的事情。 (假设它是内部连接,而不是交叉连接,正如 @LifeInTheGrey 所建议的那样。)
  • 你试过明确交叉连接吗?
  • 为了避免 FROM 子句中的错误交换表:FROM tbl_clients c, tbl_notes n ...

标签: mysql left-join


【解决方案1】:

假设categoryid 列存在于tbl_notes 表中...

尝试重写查询以使用JOIN 语法,而不是使用老式逗号作为连接运算符。 (如果问题不是错误命名的列,我怀疑问题在于混合两种类型的语法......但这只是一个怀疑,我没有理由测试将旧式逗号连接与JOIN 关键字混合.)

我会这样写声明:

SELECT n.*, c.clientname, nc.notecategoryname 
  FROM tbl_notes n
  JOIN tbl_clients c 
    ON n.clientid = c.clientid 
  LEFT
  JOIN tbl_notes_categories nc 
    ON nc.categoryid = n.categoryid
 WHERE c.clientid = 12345
 ORDER BY n.dateinserted DESC

(实际上,我会指定从 n 返回的各个列,而不是使用 n.*,但这只是样式偏好,而不是 SQL 语法要求。)

【讨论】:

  • 所以,我将LEFT JOIN 保留在可选使用的表上,而我所需的表将使用JOIN?我理解正确吗?
  • @coffeemonitor:是的,逗号连接运算符的工作方式类似于JOIN 关键字,除了JOIN 语法允许在ON 子句中指定谓词,并允许外连接.
  • 知道了。我不知道逗号被认为是旧式的。我想我明白为什么了。你的解决方案奏效了。谢谢