php - 标记层次结构和搜索

标签 php mysql search tagging

我正在尝试创建一个相对简单的可以搜索的分层标记系统。这是目前它的工作原理,这是 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 日波士顿事件”建议

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

最佳答案

嗯,您可以加入同一张表两次。假设我们有 $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 和祖 parent 两次,因为你的表中的数据不正确:parent.id = Parent2.id

实际上,这是一个非常原始的解决方案,仅允许在 1 个请求中显示 2 级层次结构。如果您想实现任何级别,请阅读堆栈上的嵌套集。还有一本很棒的书:《适合聪明人的 SQL 中的树和层次结构》,作者:Joe Celko

关于php - 标记层次结构和搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17842188/

相关文章:

mysql - 很长的 PHP 脚本的潜在问题

php - JSON 到 MySQL 表

MySql 子选择

php - 将查询输出到文本文件

arrays - 在 O(log n) 中搜索未排序数组中的值

php - 使用 mysql 和 php 查找短语

php - Bash:递归查找php文件,用php预处理,捕获输出到html文件

php - Yii- 获取由正斜杠分隔的参数。

php - 显示数据库中的图像,使用 php 不显示图片

search - Solr 中的 CopyField 似乎不起作用