2015-09-04 31 views
0

我有一个表中的字段:MySQL选择链接到同一个表中的ID的所有行

父引用同一个表(不是外键)中的主键ID。

+----+--------+------------+ 
| ID | Parent | Title | 
+----+--------+------------+ 
| 1 |  0 | Wallpapers | 
| 2 |  1 | Nature  | 
| 3 |  2 | Trees  | 
| 4 |  3 | Leaves  | 
+----+--------+------------+ 

我想选择一行和所有的父母。例如,如果我选择“树叶”,我想获得“树木”,“自然”和“墙纸”,因为这是层次结构的父路径。这可能在一个查询中吗?目前我在ColdFusion中使用一个循环来获取每个迭代的下一个父节点,但效率不够高。

+0

如果您选择自然,应该输出什么? –

+0

大自然应该会返回壁纸,因为自然的父母是1,而1是壁纸。它不应该前进,找到那一条记录的所有父母。这是用于相册,所以认为它是递归相册里面,所以如果我在里面的专辑“自然”内的父母专辑是壁纸等。 –

+0

为什么'叶'返回'自然'和'树'? “叶子”的父亲是'1',那就是“壁纸”。 – Barmar

回答

-1

试试这个

SELECT 
     DISTINCT c.id AS 'ID', c.title AS 'Name' 
FROM YourTable c, YourTable p 
WHERE c.id = p.parent AND c.title = 'Leaves' 
-1

使用联盟与返回父行另一查询返回的主行查询相结合。

SELECT * 
FROM YourTable 
WHERE Title = "Leaves" 
UNION 
SELECT t1.* 
FROM YourTable AS t1 
JOIN YourTable AS t2 ON t1.id = t2.parent 
WHERE t2.Title = "Leaves") 
+0

这只会返回一位家长,而不是所有记录的父母。 –

+0

我以为这就是你想要的:“它不应该前进,找到所有的父母记录”。 – Barmar

+0

你想要父母,祖父母,曾祖父母等? – Barmar

0

你必须使用自加盟ahieve这一点: -

SELECT T1.Title AS CHILD, T2.Title AS PARENT 
FROM YOUR_TABLE T1, YOUR_TABLE T2 
WHERE T1.PARENT = T2.ID 
AND T1.Title = 'Leaves' 

希望这有助于。

相关问题