You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL左连接语法疑问:为何指定SQL语句无法返回正确结果?

问题解析:为什么你的左连接语句无法得到正确结果?

让我来帮你拆解这个问题——你的错误语句本质是MySQL语法结构顺序错误,咱们一步步说清楚:

先明确你的需求

你需要将表中year=19的数据作为左表,year=18的数据作为右表做左连接,最终得到每个name对应两年的num数据。

错误语句的问题所在

你写的错误语句是:

SELECT `name`, `num` FROM `tb` WHERE `year` = 19 AS a LEFT JOIN ( SELECT `name`, `num` FROM `tb` WHERE `year` = 18 ) AS b ON a.`name` = b.`name`;

核心问题是**AS a的位置完全错误**:

  • 在MySQL的语法规则里,SELECT ... FROM ... WHERE ...是一个完整的查询语句块,你不能直接在这个块的末尾(WHERE year=19之后)加AS a然后接LEFT JOIN。
  • MySQL会误以为AS a是WHERE子句的一部分,直接触发语法错误,连执行都做不到,更别说得到你想要的结果了。

正确的写法(及优化)

要实现你的需求,必须把两个年份的查询分别包装成派生表(子查询),给每个派生表起别名后再进行连接,正确语句如下:

SELECT * FROM ( SELECT `name`, `num` FROM `tb` WHERE `year` = 19 ) AS a LEFT JOIN ( SELECT `name`, `num` FROM `tb` WHERE `year` = 18 ) AS b ON a.`name` = b.`name`;

执行后就能得到你预期的结果:

+------+------+------+------+
| name | num  | name | num  |
+------+------+------+------+
| a    |  500 | a    |  400 |
| b    |  400 | b    |  200 |
| c    |  400 | c    |  100 |
+------+------+------+------+

如果你想让结果列的含义更清晰,还可以给列自定义别名:

SELECT 
    a.name AS name_19, 
    a.num AS num_19, 
    b.name AS name_18, 
    b.num AS num_18 
FROM ( SELECT `name`, `num` FROM `tb` WHERE `year` = 19 ) AS a 
LEFT JOIN ( SELECT `name`, `num` FROM `tb` WHERE `year` = 18 ) AS b 
ON a.`name` = b.`name`;

优化后的结果可读性更强:

+---------+--------+---------+--------+
| name_19 | num_19 | name_18 | num_18 |
+---------+--------+---------+--------+
| a       |    500 | a       |    400 |
| b       |    400 | b       |    200 |
| c       |    400 | c       |    100 |
+---------+--------+---------+--------+

内容的提问来源于stack exchange,提问作者user7988893

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:12:51