2013-11-09 73 views
2

我无法选择多个结果与子/父母关系。这里是带有分类树的表格。该category表表示的关系,而category_name表包含名称字符串:如何在一个查询中链接SQL选择结果?

[category]     [category_name] 
id, id_parent    id, name 
-------------    -------------- 
1 NULL     1 'animal' 
2 1      2 'mammal' 
3 2      3 'lion' 
4 2      4 'sea_creature' 
5 4      5 'lion' 

作为输入我的名字,必须转化为ID的。层次结构正好3层深。例如:animal, mammal, lion, - >1, 2, 3

正如你所看到的lion名称用于不同的类别。但是,上一级类别是唯一的,子类别的名称在一个父类别中是唯一的。

我可以做三个独立的查询,从animal开始,然后再利用其id随后查询id_parent比较:

查询#1:

SELECT 
    cn.id 
FROM 
    category_name cn 
WHERE 
    cn.name = 'animal' 

(这个查询在的保存结果可变parent

查询#2:

SELECT 
    cn.id 
FROM 
    category_name cn 
INNER JOIN category c ON cn.id = c.id 
WHERE 
    cn.name = 'mammal' AND c.id_parent = <parent> 

依此类推。但我相信有更好的方法来做到这一点。

谢谢。

+0

您可以使用“UNION”并确保使用时的性能。 –

回答

2

我想这是你在找什么:

SELECT c1.id, c2.id, c3.id 
FROM category c1 
JOIN category c2 ON c1.id = c2.id_parent 
JOIN category c3 ON c2.id = c3.id_parent 
JOIN category_name cn1 ON c1.id = cn1.id 
JOIN category_name cn2 ON c2.id = cn2.id 
JOIN category_name cn3 ON c3.id = cn3.id 
WHERE cn1.name = 'animal' AND cn2.name = 'mammal' AND cn3.name = 'lion' 

输出

| C1ID | C2ID | C3ID | 
|------|------|------| 
| 1 | 2 | 3 | 

小提琴here。作为一个便笺,我建议你去谷歌搜索“嵌套集”以及“邻接列表”。

+1

谢谢!这正是我需要的。 –

相关问题