2012-09-19 49 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