我创建了一个名为users
的表,如下所示:
CREATE TABLE users (
u_id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
u_namefirst VARCHAR(100),
u_namelast VARCHAR(100),
u_email VARCHAR(100),
FULLTEXT (u_namefirst, u_namelast, u_email)
) ENGINE=MyISAM;
用数据填充它:
INSERT INTO users (u_namefirst, u_namelast, u_email) VALUES
('Michael','Williams','williams@williams.com'),
('Jon','Test','test@test.com'),
('Jane','Smith','smith@smith.com'),
('Fred','Francis','fred@fred.com'),
('Mike','Williams','mike@williams.com'),
('Michael','Burke','michael@burke.com');
然而,当我跑步时:
SELECT *
FROM users
WHERE MATCH ( u_namelast ) AGAINST ( 'williams');
我得到:“错误代码:1191。无法找到与列列表匹配的FULLTEXT索引”。索引肯定存在,其类型肯定是全文。已为该索引选择了正确的列。
我尝试过运行InnoDB和MyISAM引擎,但得到了相同的结果。作为测试,当我交换WHERE u_namefirst = 'michael'
的最后一行时,我得到了正确的结果 - 所以我不相信这是现有数据的问题。
我在Windows 7旗舰版上运行MySQL 5.6.16(x86_64)。
任何帮助表示赞赏!
答案 0 :(得分:3)
问题
您的问题似乎是(通过运行您已发布的代码)混合列名称。您在FULLTEXT INDEX
列上添加了firstname
:
ALTER TABLE user ADD FULLTEXT INDEX search ( firstname ASC );
然后在您查询时,您正在搜索姓氏字段,而不是索引:
SELECT *
FROM users
WHERE MATCH ( u_namelast ) AGAINST ( 'williams');
解决方案
索引正确的列或查询正确的列应该可以正常工作。务必使用正确的引擎(MyISAM)。你可以read more about FULLTEXT indexes with MyISAM on the MySQL documentation site。
示例强>
使用下面的示例代码,我给出了一些可行的选项,我已经包含了ALTER TABLE行,因此您可以看到该方法也可以。
CREATE TABLE users (
u_id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
u_namefirst VARCHAR(100),
u_namelast VARCHAR(100),
u_email VARCHAR(100),
FULLTEXT (u_namefirst, u_namelast, u_email)
) ENGINE=MyISAM;
ALTER TABLE users ADD FULLTEXT INDEX search ( u_namelast ASC );
INSERT INTO users (u_namefirst, u_namelast, u_email) VALUES
('Michael','Williams','williams@williams.com'),
('Jon','Test','test@test.com'),
('Jane','Smith','smith@smith.com'),
('Fred','Francis','fred@fred.com'),
('Mike','Williams','mike@williams.com'),
('Michael','Burke','michael@burke.com');
现在我们在u_namefirst, u_namelast, u_email
上有一个索引,只有一个u_namelast
。
您可以查询单个索引
SELECT *
FROM users
WHERE MATCH (u_namelast) AGAINST ('Williams');
或查询具有多个字段的
SELECT *
FROM users
WHERE MATCH (u_namefirst, u_namelast, u_email) AGAINST ('Williams');
两者都应该给你以下结果
1 Michael Williams williams@williams.com
5 Mike Williams mike@williams.com