Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Mysql从2个表中的2列进行完全搜索_Php_Mysql_Full Text Search - Fatal编程技术网

Php Mysql从2个表中的2列进行完全搜索

Php Mysql从2个表中的2列进行完全搜索,php,mysql,full-text-search,Php,Mysql,Full Text Search,我有两张桌子。一个是问题,另一个是以下格式的答案 问题(id、文本、用户) 回答(id、文本、问题\ id、用户) 显然,两个表的行数相同 当用户搜索一个短语或单词时,我希望它在问题文本和答案文本中搜索该单词,并按最常见的方式返回匹配项 我尝试使用mySQL的完整搜索,但无法在两个不同的表和两列上运行 如果可能的话,我也不想将问题和答案合并到另一个表中 问题表: CREATE TABLE `questions` ( `id` int(11) NOT NULL, `message_id` in

我有两张桌子。一个是问题,另一个是以下格式的答案

问题(id、文本、用户)

回答(id、文本、问题\ id、用户)

显然,两个表的行数相同

当用户搜索一个短语或单词时,我希望它在问题文本和答案文本中搜索该单词,并按最常见的方式返回匹配项

我尝试使用mySQL的完整搜索,但无法在两个不同的表和两列上运行

如果可能的话,我也不想将问题和答案合并到另一个表中

问题表:

CREATE TABLE `questions` (
 `id` int(11) NOT NULL,
 `message_id` int(11) DEFAULT NULL,
 `text` text NOT NULL,
 `answer` int(11) DEFAULT NULL,
 `status` varchar(255) NOT NULL,
 `user` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


ALTER TABLE `questions`
 ADD PRIMARY KEY (`id`);
ALTER TABLE `questions` ADD FULLTEXT KEY `text` (`text`);



ALTER TABLE `questions`
 MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
答案表:

 CREATE TABLE `answers` (
  `id` int(11) NOT NULL,
  `message_id` int(11) DEFAULT NULL,
  `text` text NOT NULL,
  `question` int(11) NOT NULL,
  `status` varchar(255) NOT NULL,
  `user` int(11) NOT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


 ALTER TABLE `answers`
  ADD PRIMARY KEY (`id`);
 ALTER TABLE `answers` ADD FULLTEXT KEY `text` (`text`);


ALTER TABLE `answers`
 MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

如果您不清楚该行是从哪个表中选择的,您可以检查该行的类型。

如果您想查询多个关键字,建议将其存储在应用程序代码中的某个位置(即使用分解函数分隔每个关键字)

此外,在应用程序代码中,尝试动态生成WHERE语句(因为您无法提前知道要使用的关键字数):

请注意,向每个行添加类型是为了分隔结果行的源。如果需要显示提取结果的位置,这将有助于您

剩下的,我只解释一下大概的意思。您需要使用先前构建的搜索数组与结果集进行比较。对于每个单词,尝试在返回的每一行中查找它。另一方面,您将创建一个数组来存储常见命中和数组索引(稍后将使用)。当您在一行中找到一个单词时,它在计数数组中的对应条目将递增1

完成后,只需根据命中的降序对计数数组重新排序。您将注意到,前面创建的索引id将发生移动,这将允许您在下一阶段中使用它

对于加载,您将在count数组上循环,并使用在count数组中创建的索引列从结果集中加载结果项


假设以上代码是一个总体概念,因为我不知道您使用的是哪种语言

请向我们展示一些示例数据。您是指表格中的数据吗?是,这就是我的意思。请向我们展示MySQLI中您的
text
question
列的配置设置我不知道如何在此处发送图片,但有问题:答案:两个文本字段都已索引
"(select id,text, 'que' as type from question WHERE text LIKE '%keyword%')
UNION
(select id,text,'ans' as type from answer WHERE text LIKE '%keyword%')";
String sql_where = " ";
for(int i = 0, i<search.length, i++){
   if (i=0)
      sql_where += "WHERE TEXT LIKE '%"+search[i]+"%';
   else
sql_where += "\n OR TEXT LIKE '%"+search[i]+"%';
}
query = "SELECT ID,TEXT,'QUE' AS TYPE FROM QUESTION "+sql_where+" UNION SELECT ID,TEXT,'ANS' AS TYPE FROM ANSWER "+sql_where+";";