标签的递归查询?

时间:2010-12-20 23:48:14

标签: php sql mysql

我有一个可以链接到其他标签的标签表,我希望“递归地”按照排列顺序选择标签。因此,当进行搜索时,我们得到即时(1级)结果然后继续说5级,这样我们总是有一个标签列表,无论级别1上是否有足够的完全匹配

我可以通过多次查询来管理这个问题,直到我得到足够的结果,但通过一次性查询肯定会有更好的,优化的方式吗?

任何提示将不胜感激。 谢谢!

结果:

tagId, tagWord, child, child tagId
'513', 'Slap', 'Hog Slapper', '1518'
'513', 'Slap', 'Corporal Punishment', '147'
'513', 'Slap', 'Impact Play', '1394'

查询:

SELECT t.tagId, t.tagWord as tag, tt.tagWord as child, tt.tagId as childId

FROM platform.tagWords t

INNER JOIN platform.tagsLinks l ON l.parentId = t.tagId
INNER JOIN platform.tagWords tt ON tt.tagId = l.tagId

WHERE t.tagWord = 'slap'

表格布局:

mysql> explain tagWords;
+---------+---------------------+------+-----+---------+----------------+
| Field   | Type                | Null | Key | Default | Extra          |
+---------+---------------------+------+-----+---------+----------------+
| tagId   | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| tagWord | varchar(45)         | YES  | UNI | NULL    |                |
+---------+---------------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> explain tagsLinks;
+----------+---------------------+------+-----+---------+-------+
| Field    | Type                | Null | Key | Default | Extra |
+----------+---------------------+------+-----+---------+-------+
| tagId    | bigint(20) unsigned | NO   |     | NULL    |       |
| parentId | bigint(20)          | YES  |     | NULL    |       |
+----------+---------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

2 个答案:

答案 0 :(得分:0)

AFAIK Mysql没有任何递归查询数据的机制

Oracle有Connected By构造,Sql Server有CTE(Common Table Expressions)

但是Mysql, 阅读HereHere

答案 1 :(得分:0)

每当我发现自己处于查询分层数据的情况时,我会考虑以下选项。

  1. Nested Sets
  2. Path enumeration
  3. 显式连接(当已知最高级别时)
  4. 供应商扩展程序(SQL Server CTEOracle Connect by等)
  5. 存储过程
  6. Suck it up