1

所以我有一个 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

4 回答 4

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

但是,无论何时添加/删除/移动任何标签,您都需要额外的工作来维护(必要时重新索引)这些左/右值的完整性。

于 2013-10-09T12:29:45.560 回答
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)
于 2013-10-09T12:49:00.620 回答
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
于 2013-10-09T11:40:16.890 回答
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

于 2013-10-09T12:41:20.807 回答