2013-01-21 211 views
1

加入試想一下,你有一個像這樣的表:父母子女的ID

+-------------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+-------------+------------------+------+-----+---------+----------------+ 
| id   | int(11)   | NO | PRI | NULL | auto_increment | 
| name  | varchar(255)  | NO |  |   |    | 
| parent_id | int(11)   | YES | MUL | NULL |    | 
+-------------+------------------+------+-----+---------+----------------+ 

讓我們把這個表locations

這代表着一個城市或國家。

例如,如果name字段是Los Angeles,則其parent_id將代表具有name字段California的行。

現在,假設你有另一個表是這樣的:

+-----------------+---------------+------+-----+---------+----------------+ 
| Field   | Type   | Null | Key | Default | Extra   | 
+-----------------+---------------+------+-----+---------+----------------+ 
| id    | int(11)  | NO | PRI | NULL | auto_increment | 
| name   | varchar(450) | YES |  | NULL |    | 
| state   | varchar(135) | YES |  | NULL |    | 
+-----------------+---------------+------+-----+---------+----------------+ 

讓我們把這個表cities

每一行代表一個城市,id字段與locations表中的id匹配。

在此表中,state字段始終爲空,因此我想用locations表中的name字段對其進行更新。

我已經試過爲了得到state值此查詢,但它似乎不工作(這需要很長的時間,沒有任何反應):

SELECT name FROM locations WHERE id IN 
(SELECT parent_gid FROM locations INNER JOIN cities 
ON locations.id = cities.id); 

如何實現任何建議這個?

+0

是不是從第二個表「城市」的信息完全多餘的第一個表?你爲什麼需要它? – Argeman

+0

你說得很對。不幸的是,我無權更改數據庫模式。無論如何,這是一個抽象的例子,一旦解決將允許我解決更大的問題。 – rfc1484

+0

表又如何相關?你想做什麼,更新或只選擇? –

回答

1

如果僅僅只是想SELECT語句,使用JOIN

SELECT a.id, a.name, b.name As State 
FROM cities a 
     INNER JOIN locations b 
      ON a.id = b.id 

但如果你想更新表,

UPDATE cities a 
     INNER JOIN locations b 
      On a.ID = b.ID 
SET  a.State = b.name 

UPDATE

SELECT a.id, a.name, c.name As State 
FROM cities a 
     INNER JOIN locations b 
      ON a.id = b.id 
     LEFT JOIN locations c 
      On b.parent_ID = c.id 
+0

「SELECT」查詢的問題是它只會檢索城市名稱,而不是州名。也就是說,'a.name'和'b.name'將保持相同的值。爲了檢索狀態名稱,需要使用'parent_id'字段,但我不知道具體如何。 – rfc1484

+0

你怎麼能在另一張桌子上關聯'parent_id'? –

+0

我不認爲你可以直接聯繫它,但知道一個城市'id'你可以檢索'parent_id',並用'parent_id'檢索狀態'name'。我認爲這是可能的,但我不知道如何。 – rfc1484

1

在這裏你去:我不知道如何保守並鏈接在SQL小提琴 - 但這裏是代碼:

 
create table loca (
    locaid int, 
    locaname varchar(25), 
    locaparent varchar(25)); 

create table cityb (
    citybid int, 
    citybname varchar(25), 
    citybstate varchar(25)); 

insert into loca (locaid, locaname, locaparent) 
    values (1, 'name1', 'parent1'); 
insert into loca (locaid, locaname, locaparent) 
    values (2, 'name2', 'parent2'); 
insert into loca (locaid, locaname, locaparent) 
    values (3, 'name3', 'parent3'); 
insert into cityb (citybid, citybname, citybstate) 
    values (1, 'city1', ''); 
insert into cityb (citybid, citybname, citybstate) 
    values (2, 'city2', ''); 
insert into cityb (citybid, citybname, citybstate) 
    values (3, 'city3', ''); 

update loca, cityb 
    set citybstate = locaparent 
     where locaid = citybid;
+0

不幸的是'locaparent'它是一個'ID',我想要位於'locaname'字段中的州名。然而,這是一個非常明確的抽象例子,所以+1 – rfc1484