如何解决有没有一种方法可以使用MySQL全文搜索相关表?
我有一个名为persons
的表,其中包含有关人员的数据。它还包含指向另一个表的外键。我想创建一个全文索引,以便能够在相关表中搜索全文。
以下是一些示例数据:(请参见http://sqlfiddle.com/#!9/036fc5/2)
CREATE TABLE IF NOT EXISTS `states` (
`id` char(2) NOT NULL,`name` varchar(45) NOT NULL,PRIMARY KEY (`id`)
);
INSERT INTO `states` (`id`,`name`) VALUES
('NY','New York'),('NJ','New Jersey'),('CT','Connecticut'),('PA','Pennsylvania');
CREATE TABLE IF NOT EXISTS `persons` (
`id` int auto_increment NOT NULL,`first_name` varchar(45) NOT NULL,`last_name` varchar(45) NOT NULL,`state_id` char(2) not null,PRIMARY KEY (`id`),FULLTEXT (first_name,last_name,state_id)
);
INSERT INTO `persons` (`first_name`,`last_name`,`state_id`) VALUES
('Arnold','Asher','NY'),('Bert','Bertold','NJ'),('Charlie','Chan',('Darrin','Darcy','CT');
因此,我希望能够搜索“ Jersey”中的人,例如:
SELECT * FROM persons WHERE MATCH(first_name,state_id) AGAINST('Jersey');
但是,当然,文本“ Jersey”仅存在于states
表中,而不存在于persons
表中。制定物化/生成索引是否有意义?有没有更简单的方法?
解决方法
您需要在states
表上放置一个单独的全文本索引,并与之联接。
CREATE TABLE IF NOT EXISTS `states` (
`id` char(2) NOT NULL,`name` varchar(45) NOT NULL,PRIMARY KEY (`id`),FULLTEXT (name)
);
CREATE TABLE IF NOT EXISTS `persons` (
`id` int auto_increment NOT NULL,`first_name` varchar(45) NOT NULL,`last_name` varchar(45) NOT NULL,`state_id` char(2) not null,FULLTEXT (first_name,last_name);
SELECT p.*
FROM persons p
JOIN states s ON s.id = p.state_id
WHERE MATCH(s.name) AGAINST ('Jersey')
UNION
SELECT *
FROM persons
WHERE MATCH(first_name,last_name) AGAINST ('Jersey')
,
在MySQL中,没有索引类型跨越多个表。不是全文索引,不是空间索引,不是btree索引,不是哈希索引。
您可以定义的每种索引类型都完全属于一个表,并且只能索引该表中的值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。