我正在尝试创建一个可以搜索的相对简单的分层标记系统。以下是它现在的工作原理,这是MySQL表结构:
--------------------------------------------
id | tag | parentID | topParentID |
--------------------------------------------
1 | Boston | NULL | NULL |
--------------------------------------------
2 | Events | 1 | 1 |
--------------------------------------------
3 | June 30th | 2 | 1 |
--------------------------------------------
4 | NYC | NULL | NULL |
--------------------------------------------
5 | Attractions | 4 | 4 |
--------------------------------------------
因此,如果用户在搜索栏中键入波士顿,他们将收到“波士顿活动”和“6月30日波士顿活动”的建议。同样,如果他们在搜索栏中键入NYC,他们将作为建议提供“纽约景点”。
此外,如果有人在搜索栏中输入了活动,他们会得到“波士顿活动”的建议,或者如果他们在6月30日打字,他们会得到“6月30日波士顿活动”的建议
我已经乱搞了代码来执行此操作,我绝对可以将查询字符串分解为关键字,然后在标记表中搜索每个关键字并返回匹配项,但我还没有找到正确的方法来返回完整的标记我上面提到的格式的字符串。
答案 0 :(得分:1)
好吧,你可以两次加入同一张桌子。假设,我们有$ id - 当前标记的id:
SELECT
tags.id,
tags.tag,
parent_tags.id,
parent_tags.tag,
parent2_tags.id,
parent2_tags.tag,
FROM
tags
INNER JOIN
tags AS parent_tags
ON
tags.parentID = parent_tags.id
INNER JOIN
tags AS parent2_tags
ON
tags.topParentID = parent2_tags.id
WHERE
tags.id=$id
但由于表格中的数据不正确,它会给父母和祖父母两次:parent.id = parent2.id
实际上,这是一个非常原始的解决方案,只允许在1个请求中显示2个级别的层次结构。如果要实现任何级别,请阅读堆栈上的嵌套集。还有一本很棒的书:Joe Celko的“SQL中的树和层次结构”,来自Joe Celko
答案 1 :(得分:0)
我认为您可以删除topParentID列并添加一个名为“level”的列(Boston将具有级别0,事件级别1,6月30日级别2)。 因此,您可以通过此级别列冷排序并破坏值,这样您就可以得到您想要的内容。
你可以在没有关卡的情况下做到这一点,但我认为在php方面会有更多的工作。