加入所需的查询帮助

时间:2013-09-19 20:06:31

标签: mysql join left-join

我有两张桌子

学生

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

但结果返回所有zipcode表行,但我需要输出为

name std_zip city
XXX  123     dk
YYY  124     raj

3 个答案:

答案 0 :(得分:1)

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

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

在这种情况下,第一个版本可能会表现更好。请参阅FIDDLE

答案 1 :(得分: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

DEMO: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

答案 2 :(得分:0)

SELECT s.name, z.zipcode
FROM student AS s
LEFT JOIN zipcode AS z ON SUBSTRING(s.id, 3) = z.zip

因为子字符串是一个函数,结果不是“真正的”表字段,所以不能在ON子句中使用它。所以在on子句中使用substring应该可以解决问题。

为什么你会在ID中有邮政编码?你桌上的第10名学生会怎么样?他/她有什么身份证?