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
相关产品推荐
相关产品推荐

