【问题标题】:How to select the tag accurately from the tag column with the list of tag?如何从标签列表中的标签列中准确选择标签?
【发布时间】:2011-11-16 02:32:41
【问题描述】:

如何在标签列表的标签列中准确选择标签?

例如下面是使用查询创建的表,但我想缩小搜索范围,

page_id         tags
1               tile-1,tile-12,tile-10
2               tile-1,tile-10
3               tile-12,tile-10
4               tile-15,tile-16

我追求的结果是只有tile-1 的页面,

page_id         tags
1               tile-1,tile-12,tile-10
2               tile-1,tile-10

但我在下面处理的查询会返回所有这些,包括tile-12tile-10 等。

SELECT*
FROM (...) AS k
WHERE k.tags LIKE '%tile-1%'

我可以不使用LIKE吗?

【问题讨论】:

  • 正如下面有人回答的那样,您的架构真的很糟糕。它完全没有标准化。最好现在更改它 - 如果您在项目中走得更远,这样的架构将成为 a$$ 的痛苦。

标签: php mysql tagging sql-like


【解决方案1】:

我建议将架构更改为 page_id, 标记。让您的数据看起来像这样

1           tile-1
1           tile-12
1           tile-10
2           tile-1
2           tile-10
3           tile-12
3           tile-10
4           tile-15
4           tile-16

然后你可以通过一个简单的查询来完成所有这些,

SELECT * FROM table WHERE tag = 'title-1';

这样您就不必搜索表(表扫描) - 一旦表有更多行(可扩展的解决方案),这将成为一个问题。 其次,您可以在标签列上使用索引,以使搜索超级快。

【讨论】:

    【解决方案2】:

    由于您使用逗号作为分隔符,因此您的 LIKE-statement 必须包含逗号:

    SELECT * FROM table WHERE tags LIKE '%title-1,%';
    

    【讨论】:

    • 哦,不用等了。 tile-10,tile-1tile-1 会发生什么?
    • 嗯,对不起,如果我误解了你的问题。如果标签列只应该包含title-1,那么听起来你应该使用= insted of LIKE...在上表中你不会得到任何匹配,这就是你所追求的吗?
    • 没关系。我使用正则表达式来解决我的问题[[:<:]]tile-1[[:>:]] :-)
    猜你喜欢
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-12
    • 2012-10-21
    相关资源
    最近更新 更多