2013-10-09 48 views
1

所以我有一个存储了关联到彼此像这样的标签负载的MySQL表:MYSQL选择标签相关的ID从同一个表

id level upper_tag value 
---------------------------------------------- 
1 0  0   Electric 
2 0  0   Home 
3 1  2   Gas Cooker 
4 1  1   wire 
5 2  4   superconductor_wire 
6 0  0   Sexy stuff 
7 2  3   cleaner 
8 0  0   Sport 
9 1  8   trainers 
10 1  8   rugby 
11 2  10   Nike 

基本上我需要找到相关的变量,所以如果我通话运动我想要的标签:运动,教练,橄榄球和耐克返回。如果我选择标签橄榄球,我会回橄榄球和耐克。

我有一个想法,我不知道如果我在正确的路线,因为我是一个MYSQL noob。这里是我的尝试,但它并没有给我正确的答案:

SELECT * FROM tag t 
WHERE t.`id` = (SELECT `upper_tag` FROM tag) AND t.`id` = 8 
; 

SQLFIDDLE

+0

'SELECT upper_tag FROM tag'会给你一堆ID,你不能这样比较。你必须仅在ID上进行比较。 –

+2

您需要一个相当复杂的解决方案。没有额外的代码,你就不能遍历多层次的关系。这里有一个解决方案虽然:http://stackoverflow.com/questions/19091457/get-all-children-by-parent-in-mysql-query – AgRizzo

+0

我想这会比做迷你查询的负载更好 – bubblebath

回答

1

你所寻找的是一个嵌套集模型 - 通过Wiki文章阅读,看到左/右值是如何分配的例子。一旦你有了这两列添加索引正确,您的查询就会越简单

SELECT t.* FROM tag t 
WHERE t.`left` >= X and t.`right` <= Y 

哪里X是“左”的价值和Y是“运动”标签“正确”的价值

您可以结合查找实际加载到一个查询

SELECT t.* FROM tag t 
JOIN tag t ON t.`left` >= b.`left` AND t.`right` <= b.`right` 
WHERE b.id = 8 

Howerver你需要额外的工作来维持(必要时重新索引),只要你添加/删除/移动任何标记这些左/右值的完整性。

0
如果你想在所有的水平,你需要使用连接与联合

。为每个更深层次的每个查询添加一个连接。

select * from 
(
select t1.id as parent, t2.* from tag t1 
inner join tag t2 on t1.id=t2.parent_id 
union 
select t1.id as parent, t3.* from tag t1 
inner join tag t2 on t1.id=t2.parent_id 
inner join tag t3 on t2.id=t3.parent_id 
) tag where tag.parent=1 
+0

这是不正确的,因为我会知道的ID,所以我想要选择ID'8',我想基本上递归搜索显示所有标签有一个upper_tag最终结束与搜索到的标签一起。如果我选择ID 8这不会返回教练,橄榄球和耐克 – bubblebath

+0

啊,你还需要耐克?你需要做很多自我加入。 – AdrianBR

+0

编辑回来你需要的 – AdrianBR

0
SELECT * FROM tag t WHERE t.upper_tag=8 OR t.id=8 

这应该给你的价值upper_tag = 8和id = 8

运动= 8,橄榄球= upper_tag 8教练机所有标签= upper_tag 8

0

尝试这样

SELECT * 
from tag AS t 
WHERE (t.upper_tag IN(SELECT id from tag WHERE upper_tag=8)) 
    OR (t.id = 8) OR (t.upper_tag = 8) 
+0

如果我向耐克(可能发生)添加另一个标签,则它失败:( – bubblebath

相关问题