所以我有一个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
;
答案 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)