假设这两个表:
博客
id title keywords
1 Hello hello,world,test
2 Google search, email, security
3 Microsoft clippy, collaboration
类别
id keywords
1 test, world, clippy
如何搜索在类别行中有一个或多个与关键字匹配的关键字的博客行?
答案 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)
我没有看到使用简单查询的好方法。如果你真的必须有这种数据模型,我看到的唯一方法是遍历表并自己匹配每一行。您可以在存储过程中或从客户端代码执行此操作。是的,它会很糟糕,但无论如何查询引擎都无法做得更好。请务必使用光标而不是将整个表加载到应用程序内存中。