簡體   English   中英

MYSQL從同一表中選擇標簽關聯的ID

[英]MYSQL select tag associated id's from same table

因此,我有一個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

您正在尋找的是嵌套集模型-閱讀Wiki文章,並查看有關如何分配左/右值的示例。 一旦添加了這兩列並正確地建立了索引,您的查詢將變得非常簡單

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

其中X是'Sport'標簽的'left'值, Y是'Sport'標簽的'right'值

您可以將一個實際加載的查詢合並到一個查詢中

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

但是,無論何時添加/刪除/移動任何標簽,您都需要付出額外的工作來維護(必要時重新索引)這些左/右值的完整性。

如果要在所有級別使用它,則需要使用聯接和聯合。 對於每個更深的級別,每個查詢添加一個聯接。

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
SELECT * FROM tag t WHERE t.upper_tag=8 OR t.id=8

這應該為您提供所有值為upper_tag = 8且id = 8的標簽

運動= 8,橄欖球=上標8,教練=上標8

這樣嘗試

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM