1

我有两张桌子

学生

id      name
1-123   XXX
1-124   YYY

邮政编码

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

但结果返回邮政编码表的所有行,但我需要输出为

name std_zip city
XXX  123     dk
YYY  124     raj
4

3 回答 3

1

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

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

在这种情况下,第一个版本可能会表现得更好。见小提琴

于 2013-09-19T20:12:14.650 回答
0

你不能加入使用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

演示:http ://sqlfiddle.com/#!2/d0478/2


但是,在 MySQL 中,在一个字段中有多个值是不好的做法。你真的应该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

新演示:http ://sqlfiddle.com/#!2/8137b/2

于 2013-09-19T20:11:45.037 回答
0
SELECT s.name, z.zipcode
FROM student AS s
LEFT JOIN zipcode AS z ON SUBSTRING(s.id, 3) = z.zip

因为 subtring 是一个函数,并且结果不是“真实”表字段,所以您不能在 ON 子句中使用它。因此,在 on-clause 中使用 substring 应该可以解决问题。

是否有任何特定原因导致您在 ID 中包含邮政编码?你桌子上的第 10 个学生会发生什么?他/她有什么身份证?

于 2013-09-19T20:12:04.377 回答