MYSQL从同一个表中选择标记关联的id

时间:2013-10-09 11:34:57

标签: php mysql sql

所以我有一个MYSQL表,它存储了一大堆相互关联的标签,如下所示:

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菜鸟。这是我的尝试,但它没有给我正确的答案:

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

SQLFIDDLE

4 个答案:

答案 0 :(得分: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

当你添加/删除/移动任何标签时,你需要额外的工作来维护(根据需要重新索引)这些左/右值的完整性。

答案 1 :(得分: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

答案 2 :(得分:0)

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

这应该为您提供值为upper_tag = 8和id = 8

的所有标签

sport = 8,rugby = upper_tag 8,trainer = upper_tag 8

答案 3 :(得分: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)