我有两张桌子
学生
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
答案 0 :(得分:1)
您不能在同一查询的SELECT
或ON
子句中使用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
答案 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名学生会怎么样?他/她有什么身份证?