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

基本的に、関連するタグを見つける必要があるため、sport を呼び出す場合は、次のタグが必要です: Sport、trainers、rugby、nike が返されます。タグラグビーを選んだら、ラグビーとナイキが戻ってきます。

私は考えましたが、MYSQL初心者であるため、正しい方向に進んでいるかどうかわかりません。ここに私の試みがありますが、正しい答えが得られません:

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

SQLFIDDLE

4

4 に答える 4

1

あなたが探しているのはネストされたセットモデルです -ウィキの記事を読んで、左/右の値がどのように割り当てられるかの例を見てください。これらの 2 つの列を追加して正しくインデックスを作成すると、クエリは次のように単純になります。

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

「Sport」タグのX「左」の値と「右」の値はどこですかY

ルックアップと実際の読み込みを 1 つのクエリに組み合わせることができます

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 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 に答える
0

すべてのレベルでそれが必要な場合は、結合と結合を使用する必要があります。より深いレベルごとに、クエリごとに 1 つの結合を追加します。

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 に答える