2012-09-19 85 views
3

我有一個包含'id','master_id'和'searchMe'(簡化)三列的'電影'表。我有另一個表'temp_ids'與一列:'id'。這是一張臨時桌子,但我認爲不重要。將多列結果插入單列表

當我做出這樣

SELECT `id`, `master_id` FROM 'movies' WHERE searchMe = '1'; 

在我的表「電影」的查詢,我收到了多列結果。現在我想將每個id和每個master_id插入到'temp_ids'-Table中,但是每次只有一個。所以,如果我的結果是

id_1 | master_1 
id_2 | master_2 
id_3 | NULL 

我希望我的temp_ids看起來像

id_1 
master_1 
id_2 
master_2 
id_3 

所以我想每一個列轉換的結果爲自己的行。我如何以優雅的方式做到這一點? 我知道我可以在多個查詢中完成它,分別搜索id和master_id,並且我知道我可以用PHP等解決這個問題。但我更喜歡它在單個mysql查詢中解決這個問題,如果這樣的事情是可能的。

我爲這個sqlfiddle: http://sqlfiddle.com/#!2/b4a7f/2

+0

我很好奇知道:爲什麼你需要這樣做? – Jocelyn

+0

我正在構建一個需要取消引用許多電影並使用該數據的工具。有幾個查詢需要訪問這個id_collection(這個例子當然簡化了),所以我想把它收集在一個單獨的表中,而不是每個模塊自己創建這個集合。我想看看是否有一種簡單的方法可以在一次罷工中完成,而不是使用PHP-Backend。並且有:) – EmilioMg

回答

2

SELECT數據,你可以使用這個UNION ALL

SELECT `id` 
FROM movies 
WHERE searchMe = 1 
union all 
SELECT `master_id` 
FROM movies 
WHERE searchMe = 1 
    and master_id is not null 

看到SQL Fiddle with Demo

這樣做,這樣,你不能與來自每列什麼價值區分開來,這樣你就可以隨時添加一個指標,這會給你兩列,但是,那麼你知道在哪裏的數據來自:

SELECT `id`, 'id' type 
FROM movies 
WHERE searchMe = 1 
union all 
SELECT `master_id`, 'master' 
FROM movies 
WHERE searchMe = 1 
    and master_id is not null 

然後您只需使用此查詢INSERT INTO temp使用此SELECT

+0

UNION ALL ... omg,我沒記得那個。謝謝,這正是我需要的,以優雅的方式解決。 :) – EmilioMg

+0

@EmilioJ高興地幫忙。雖然我不完全知道你需要一列中的數據,但我會建議如果需要使用第二個查詢中的指標,那麼你可以知道數據來自哪一列。 :) – Taryn

+1

不,在我的特殊情況下,指標是不需要的。我只需要收集符合特定條件的ID,然後我可以進一步處理數據。儘管如此,該指標可能對其他人有用,所以你的答案是首選的;-) – EmilioMg

2

這會是這樣

INSERT INTO temp_ids(id) 
SELECT id 
FROM 
(
    SELECT id 
    FROM FirstTable 
    UNION 
    SELECT master AS id 
    FROM SecondTable 
) t