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调用会使情况变得更糟。。即使使用索引,也需要两次完整的表扫描,并且优化器没有找到可能使用的键。实际上,第一个版本更好。当您需要运行聚合函数或获取要加入的较小选择时,子查询/派生表可以提高性能,然后运行它才有意义。