1

私は2つのテーブルを持っています

学生

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

2 回行うのを避けるために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実際のフィールドではないため、JOIN を使用することはできません。SUBSTRJOINするときは再度呼び出す必要があります。

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 では、1 つのフィールドに複数の値を入れることはお勧めできません。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 で部分文字列を使用するとうまくいくはずです。

ID に郵便番号が含まれている特定の理由はありますか? テーブルの 10 番目の生徒はどうなりますか? 彼/彼女はどのIDを持っていますか?

于 2013-09-19T20:12:04.377 に答える