2012-11-08 27 views
0

我有一個大的插入查詢是這樣的:插入給定的值和多行從相關表

INSERT INTO video_tags 
    (vid_id, tag_id) 
VALUES 
    (1,7), 
    (2,46), 
    (2,52) Etc. Etc. 

但是我沒有tag_ids插入,只有標籤的字符串。因此,我需要在插入標籤時查找標籤ID。標籤被存儲在查找表中有兩列:

+-----+---------+ 
| id | int  | 
| tag | varchar | 
+-----+---------+ 

我想要做這樣的事情:

INSERT INTO video_tags 
    (vid_id, tag_id) 
VALUES 
    (1, SELECT id FROM tags WHERE tag = 'banana'), 
    (2, SELECT id FROM tags WHERE tag = 'tree') 
    (2, SELECT id FROM tags WHERE tag = 'chimps') 

...但是,這並不工作,反正看起來繁瑣,效率低下。

我也看到這種情況:

INSERT INTO video_tags 
    (vid_id, tag_id) 
VALUES 
    SELECT '1', id FROM tags WHERE tag = 'banana') 

...但我不能得到這個與多個選擇工作。

+0

如何製造具有你'vid_id's和標籤的字符串表,然後做一些像'insert into ... from(select vid_id,tag_id' –

+0

)除非我誤解你,否則我有這樣一個表,它是我試圖插入值的那個表 –

+0

你插入的那個沒有'vid_id's和標籤字符串。它有'vid_id's和'tag_id's。 –

回答

2

您的查詢可以去像這樣:

CREATE TABLE rawdata 
    (`vid_id` int, `tag_name` varchar(10)) 
; 

INSERT INTO rawdata 
    (`vid_id`, `tag_name`) 
VALUES 
    (1, 'banana'), 
    (2, 'tree'), 
    (2, 'chimps') 
; 

INSERT INTO video_tags 
SELECT rawdata.vid_id, tag.id FROM 
rawdata 
LEFT JOIN tag ON tag.tag = rawdata.tag_name 
; 

DROP TABLE rawdata 

http://sqlfiddle.com/#!2/89171/2

+0

啊我明白你的意思了。這就說得通了。 –

+0

完美的作品。謝謝! –

1

試試這個::

INSERT INTO video_tags 
    (vid_id, tag_id) 
VALUES 
    (1, (SELECT id FROM tags WHERE tag = 'banana')), 
    (2, (SELECT id FROM tags WHERE tag = 'tree')), 
    (2, SELECT id FROM tags WHERE tag = 'chimps')); 
+0

嗯。這確實有效,但只有5個條目需要0.1s。如果我嘗試我的整個查詢,我會發現資源錯誤。必須有一個更有效的方法來做到這一點......? –