在两个逗号分隔的字段之间搜索

时间:2011-01-13 14:41:02

标签: sql mysql

假设这两个表:

博客

id title      keywords
1  Hello      hello,world,test
2  Google     search, email, security
3  Microsoft  clippy, collaboration

类别

id keywords
1  test, world, clippy

如何搜索在类别行中有一个或多个与关键字匹配的关键字的博客行?

2 个答案:

答案 0 :(得分:1)

简洁:如果您想要执行该操作,则不会存储您的数据。您规范化数据,并使用规范化数据进行搜索:

CREATE TABLE Blog
(
    id      INTEGER NOT NULL PRIMARY KEY,
    title   VARCHAR(30) NOT NULL
);

INSERT INTO Blog(id, title) VALUES(1, 'Hello');
INSERT INTO Blog(id, title) VALUES(2, 'Google');
INSERT INTO Blog(id, title) VALUES(3, 'Microsoft');

CREATE TABLE BlogKeywords
(
    id      INTEGER NOT NULL,
    keyword VARCHAR(20) NOT NULL,
    PRIMARY KEY(keyword, id)
);

INSERT INTO BlogKeywords(id, keyword) VALUES(1, 'hello');
INSERT INTO BlogKeywords(id, keyword) VALUES(1, 'world');
INSERT INTO BlogKeywords(id, keyword) VALUES(1, 'test');
INSERT INTO BlogKeywords(id, keyword) VALUES(2, 'search');
INSERT INTO BlogKeywords(id, keyword) VALUES(2, 'email');
INSERT INTO BlogKeywords(id, keyword) VALUES(2, 'security');
INSERT INTO BlogKeywords(id, keyword) VALUES(3, 'clippy');
INSERT INTO BlogKeywords(id, keyword) VALUES(3, 'collaboration');

CREATE TABLE Category
(
    id      INTEGER NOT NULL,
    keyword VARCHAR(20) NOT NULL,
    PRIMARY KEY(id, keyword)
);

INSERT INTO Category(id, keyword) VALUES(1, 'test');
INSERT INTO Category(id, keyword) VALUES(1, 'world');
INSERT INTO Category(id, keyword) VALUES(1, 'clippy');

现在您可以使用简单连接轻松搜索:

SELECT DISTINCT b.id AS BlogID, b.Title, c.id AS CategoryID
  FROM Blog AS b
  JOIN BlogKeywords AS K ON b.id      = k.id
  JOIN Category     AS C ON k.keyword = c.keyword;

如果有多个类别,您还不清楚自己想要看到什么。

答案 1 :(得分:0)

我没有看到使用简单查询的好方法。如果你真的必须有这种数据模型,我看到的唯一方法是遍历表并自己匹配每一行。您可以在存储过程中或从客户端代码执行此操作。是的,它会很糟糕,但无论如何查询引擎都无法做得更好。请务必使用光标而不是将整个表加载到应用程序内存中。