所以,当我想选择内部sql语句中存在的所有ID时,我们知道这个有效吗
Select *
FROM TableA
WHERE Column1 IN (SELECT column2 FROM tableB WHERE = condition)
如果Column1
是一个长字符串,我需要做什么样的语法,我需要检查某个子字符串是否存在。
Ex Column1 = "text text text text 12345"
其中12345是内部sql语句给出的ID列表中的ID
基本上我试图根据另一个表中的ID列表来检测另一个表中的一个字符串中是否存在ID。
我应该在SQL中执行此操作还是让服务器端代码执行此操作?
答案 0 :(得分:3)
这通常使用LIKE
运算符完成:
SELECT ... FROM ... WHERE Column1 LIKE "%12345%";
然而,这非常慢,因为它基于子串匹配。要提高性能,您必须创建一个存储单个单词的搜索索引表。这种索引通常由触发器定义维护:每当条目改变时,触发器也改变提取到搜索索引表中的单词集。在这样的索引表中搜索显然很快,并且可以基于索引中的单词与表中原始条目之间的JOIN
关系,通过n:1
与原始表结合使用。
答案 1 :(得分:1)
而不是使用fieldname like '%needle%'
搜索,因为它无法使用索引而速度极慢,所以在给定列上创建fulltext index并使用fulltext search来查找匹配的子字符串。
以下代码摘录引自MySQL文档:
CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body)
) ENGINE=InnoDB;
SELECT * FROM articles
WHERE MATCH (title,body)
AGAINST ('database' IN NATURAL LANGUAGE MODE);
带语法的catch是在上面的代码示例中查找的单词列表('database'
)必须是字符串文字,它不能是子查询。您需要在调用sql语句的应用程序中组合关键字列表。