2011-12-14 126 views
-1

假定以下表:MySQL:在另一个子查询中使用子查询的结果?

TABLE: foo 
========================= 
| foo_id | fk_id | name | 
========================= 
| 1  | 100 | A | 
| 2  | 100 | B | 
| 3  | 200 | C | 
| 4  | 200 | D | 
| 5  |  | E | 
| 6  |  | F | 
------------------------- 

TABLE: foo_combo 
=============================================== 
| foo_combo_id | parent_foo_id | child_foo_id | 
=============================================== 
| 1   | 5    | 1   | 
| 2   | 5    | 2   | 
| 3   | 6    | 3   | 
| 4   | 6    | 4   | 
----------------------------------------------- 

我需要得到由高达foo其中fk_id是100使用的采样数据中提供的所有foo其中fk_id是100和所有foo组合,我需要fk_id = 1 ,2(这些具有fk_id = 100)和5(这是由foo组成的foo,其具有fk_id = 100)。

SQL应该是什么样子?

编辑1:

两个查询我认为需要进行组合:

SELECT * FROM foo WHERE fk_id = 100 
SELECT foo.* FROM foo, foo_combo WHERE foo_combo.child_id IN (SELECT foo_id FROM foo WHERE fk_id = 100) AND foo.foo_id = foo_combo.parent_foo_id ??? 

回答

0
select foo_id from (
    select foo_id, fk_id from foo 
    union all 
    select c.parent_foo_id, f.fk_id from foo_combo c inner join foo f on (c.child_foo_id = f.foo_id) 
) foo_union where fk_id = 100; 

这应该返回类似

+--------+ 
| foo_id | 
+--------+ 
|  1 | 
|  2 | 
|  5 | 
|  5 | 
+--------+ 

5重复,因为它匹配的两倍。如果你不想要,可以尝试添加“独特” - 丑陋但可用。

0

我想这是你所追求的:

select f.* 
from foo f 
inner join foo_combo fc on fc.child_foo_id = f.foo_id 
where f.fk_id = 100; 

虽然我无法确定foo_combo表中的列是child_foo_idchild_id(示例数据和示例查询以不同方式引用此列)。

+0

这将不会返回组合ID。 – 2011-12-14 08:35:03

+0

对。我想我需要`联合',但不知何故在第二个查询中引用第一个查询的结果。 – StackOverflowNewbie 2011-12-14 08:42:18

0
SELECT * FROM (
    SELECT foo_id FROM foo 
    WHERE fk_id = 100 
    UNION 
    SELECT foo_id FROM foo f 
    JOIN foo_combo c ON f.foo_id = c.parent_foo_id 
    WHERE fk_id = 100 
    UNION 
    SELECT foo_id FROM foo f 
    JOIN foo_combo c ON f.foo_id = c.parent_foo_id 
    WHERE fk_id = 100) as ids 
JOIN foo USING(foo_id); 
相关问题