假设以下表格:
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
为100的所有fk_id
以及由foo
组成的所有foo
组合,其中fk_id
为100。提供的示例数据,我需要fk_id
= 1,2,(这些有fk_id
= 100)和5(这是由foo
组成的foo
fk_id
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 ???
{{1}} 1}} = 100)。
SQL应该是什么样的?
编辑1:
我认为需要合并的两个查询:
{{1}}
答案 0 :(得分: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_id
还是child_id
(示例数据和示例查询以不同方式引用此列)。
答案 1 :(得分: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,因为它匹配两次。如果您不想这样,请尝试添加“distinct” - 丑陋但可以使用。
答案 2 :(得分: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);