Mysql 需要加入查询帮助

Mysql 需要加入查询帮助,mysql,join,left-join,Mysql,Join,Left Join,我有两张桌子 学生 id name 1-123 XXX 1-124 YYY zipcode zip city 123 dk 124 raj 125 bog 我需要在每个学生旁边显示城市名称。我尝试在mysql中使用以下查询 SELECT student.name as name, SUBSTR(student.id,3,3) as std_zip, zipcode.city FROM student LEFT JOIN zipcode ON std_zip=zipc

我有两张桌子

学生

id      name
1-123   XXX
1-124   YYY
zipcode

zip  city
123  dk
124  raj
125  bog
我需要在每个学生旁边显示城市名称。我尝试在mysql中使用以下查询

SELECT student.name as name, SUBSTR(student.id,3,3) as std_zip, zipcode.city
FROM student LEFT JOIN zipcode ON std_zip=zipcode.zip
但结果返回zipcode表的所有行,但我需要输出为

name std_zip city
XXX  123     dk
YYY  124     raj

您不能使用
std_-zip
加入,因为它不是一个真正的字段。当您加入时,需要再次调用
SUBSTR

SELECT student.name AS name,
SUBSTR(student.id,3,3) AS std_zip, zipcode.city

FROM student

LEFT JOIN zipcode ON SUBSTR(student.id,3,3)=zipcode.zip
演示:


然而,在MySQL中,在一个字段中有多个值是不好的做法。您应该在student表中创建
zip
自己的字段。它应该是这样的:

id   zip   name
1    123   XXX
2    124   YYY
这样,您的查询会更美观:

SELECT student.name AS name, student.zip, zipcode.city

FROM student

LEFT JOIN zipcode ON student.zip=zipcode.zip

新演示:

您不能使用
std\u-zip
加入,因为它不是真正的字段。当您加入时,需要再次调用
SUBSTR

SELECT student.name AS name,
SUBSTR(student.id,3,3) AS std_zip, zipcode.city

FROM student

LEFT JOIN zipcode ON SUBSTR(student.id,3,3)=zipcode.zip
演示:


然而,在MySQL中,在一个字段中有多个值是不好的做法。您应该在student表中创建
zip
自己的字段。它应该是这样的:

id   zip   name
1    123   XXX
2    124   YYY
这样,您的查询会更美观:

SELECT student.name AS name, student.zip, zipcode.city

FROM student

LEFT JOIN zipcode ON student.zip=zipcode.zip
新演示:

因为子字符串是一个函数,并且结果不是“实”表字段,所以不能在ON子句中使用它。因此,在on子句中使用子字符串应该可以做到这一点

你为什么要在ID中使用zipcode,有什么具体的原因吗?你桌上的第十个学生怎么了?他/她有什么身份证

因为子字符串是一个函数,并且结果不是“实”表字段,所以不能在ON子句中使用它。因此,在on子句中使用子字符串应该可以做到这一点


你为什么要在ID中使用zipcode,有什么具体的原因吗?你桌上的第十个学生怎么了?他/她有什么ID?

您不能在同一查询的
子句中使用
选择
别名,您需要使用表达式本身

SELECT student.name as name, SUBSTR(student.id, 3, 3) as stud_zip, zipcode.city as city
FROM student
LEFT JOIN zipcode
ON SUBSTR(student.id, 3, 3) = zipcode.zip
要避免重复执行
SUBSTR
,可以使用子查询:

SELECT student.name, student.zip, zipcode.city
FROM (SELECT name, SUBSTR(student.id, 3, 4) as zip
      FROM student) student
LEFT JOIN zipcode
ON student.zip = zipcode zip

在这种情况下,第一个版本的性能可能会更好。请参见

您不能在
上的
中使用
选择
别名,其中
子句属于同一查询,您需要使用表达式本身

SELECT student.name as name, SUBSTR(student.id, 3, 3) as stud_zip, zipcode.city as city
FROM student
LEFT JOIN zipcode
ON SUBSTR(student.id, 3, 3) = zipcode.zip
要避免重复执行
SUBSTR
,可以使用子查询:

SELECT student.name, student.zip, zipcode.city
FROM (SELECT name, SUBSTR(student.id, 3, 4) as zip
      FROM student) student
LEFT JOIN zipcode
ON student.zip = zipcode zip

在这种情况下,第一个版本的性能可能会更好。查看我强烈建议将
zip
存储在
student
中自己的字段中,将其作为
id
字段的一部分,并且需要使用
SUBSTR
是一种不好的做法。出色的id编号..您希望id包含zip吗?我强烈建议将
zip
存储在
student
中自己的字段中将其作为
id
字段的一部分并需要使用
SUBSTR
是一种不好的做法。出色的id编号..您希望id包含zip吗?当您希望避免派生表调用两个SUBSTR时,会使事情变得更糟。。即使使用索引,也需要两次完整的表扫描,并且优化器没有找到可能使用的键。实际上,第一个版本更好。当您需要运行聚合函数或获取要加入的较小选择时,子查询/派生表可以提高性能,那么运行它是有意义的由派生表执行的两个SUBSTR调用会使情况变得更糟。。即使使用索引,也需要两次完整的表扫描,并且优化器没有找到可能使用的键。实际上,第一个版本更好。当您需要运行聚合函数或获取要加入的较小选择时,子查询/派生表可以提高性能,然后运行它才有意义。