搜索以逗号分隔的字段

发布于 2024-10-24 22:21:40 字数 620 浏览 4 评论 0原文

示例表

CREATE TABLE 
   `foo` (
        `id` INT NOT NULL AUTO_INCREMENT ,     
        `keyword_ids` VARCHAR(128) ,     
        PRIMARY KEY (`id`)  
   );

示例数据

INSERT INTO 
    `foo`
SET
    `keyword_ids` = '14,10,5,19,12'

示例查询

SELECT 
    * 
FROM 
    `foo` 
WHERE 
    (`keyword_ids` LIKE '5,%%' 
    OR 
    `keyword_ids` LIKE '%%,5' 
    OR 
    `keyword_ids` = '5' 
    OR 
    `keyword_ids` LIKE '%%,5,%%')

根据我最近的问题,这工作得很好,但是有什么方法可以改进它?

Sample Table

CREATE TABLE 
   `foo` (
        `id` INT NOT NULL AUTO_INCREMENT ,     
        `keyword_ids` VARCHAR(128) ,     
        PRIMARY KEY (`id`)  
   );

Sample Data

INSERT INTO 
    `foo`
SET
    `keyword_ids` = '14,10,5,19,12'

Sample Query

SELECT 
    * 
FROM 
    `foo` 
WHERE 
    (`keyword_ids` LIKE '5,%%' 
    OR 
    `keyword_ids` LIKE '%%,5' 
    OR 
    `keyword_ids` = '5' 
    OR 
    `keyword_ids` LIKE '%%,5,%%')

As per my most recent question, this works just fine but is there a way I can improve it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

可爱咩 2024-10-31 22:21:40
SELECT  *
FROM    foo
WHERE   FIND_IN_SET(5, keyword_ids)

但请注意,此表达式仍然不可控制,这意味着 keyword_ids 上的索引无法改进此查询。

如果您希望快速搜索模型,则应该标准化您的模型。

另一种选择是在表中存储逗号分隔的关键字(而不是 ids),并在它们上创建 FULLTEXT 索引:

CREATE FULLTEXT INDEX fx_foo_keyword ON (keywords)

SELECT  *
FROM    foo
WHERE   MATCH(keywords) AGAINST ('+keyword5' IN BOOLEAN MODE)

但是,这仅适用于 MyISAM 表。

SELECT  *
FROM    foo
WHERE   FIND_IN_SET(5, keyword_ids)

Note, however, that this expression is still not sargable, that means an index on keyword_ids cannot improve this query.

You should normalize your model if you want this to be searchable fast.

Another option is to store comma-separated keywords (rather than ids) in the table and create a FULLTEXT index on them:

CREATE FULLTEXT INDEX fx_foo_keyword ON (keywords)

SELECT  *
FROM    foo
WHERE   MATCH(keywords) AGAINST ('+keyword5' IN BOOLEAN MODE)

This, however, would only work on a MyISAM table.

深爱不及久伴 2024-10-31 22:21:40

看一下 FIND_IN_SET 功能。

Take a look at the FIND_IN_SET function.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文