0

我正在尝试创建一个可以搜索的相对简单的分层标记系统。这是它现在的工作方式,这是 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,他们将收到“NYC Attractions”作为建议。

此外,如果有人在搜索栏中输入事件,他们会得到建议“波士顿事件”,或者如果他们输入 6 月 30 日,他们会得到建议“波士顿事件 6 月 30 日”

我已经弄乱了代码来做到这一点,我绝对可以将查询字符串分解为关键字,然后在标签表中搜索每个关键字并返回匹配项,但我还没有找到正确的方法来返回完整的标签字符串我上面提到的格式。

4

2 回答 2

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 中的树和层次结构”

于 2013-07-24T18:47:02.733 回答
0

我认为您可以删除 topParentID 列并添加一个称为“级别”的列(波士顿将有级别 0,事件级别 1,6 月 30 日级别 2)。因此,您按此级别列冷排序并内爆这些值,这样您就可以得到您想要的东西。

你可以在没有 level 列的情况下做到这一点,但我认为在 php 方面会做更多的工作。

于 2013-07-24T18:47:21.000 回答