Php 组合两个MySQL搜索查询
我使用以下方法创建搜索查询,该查询按出现次数对搜索词进行评分:Php 组合两个MySQL搜索查询,php,mysql,Php,Mysql,我使用以下方法创建搜索查询,该查询按出现次数对搜索词进行评分: public function findAll($search, array $data = []) { $query = DB::query(" SELECT SQL_CALC_FOUND_ROWS *, SUM(MATCH(text) AGAINST('{$search}' IN BOOLEAN MODE)) as score FRO
public function findAll($search, array $data = []) {
$query = DB::query("
SELECT
SQL_CALC_FOUND_ROWS
*,
SUM(MATCH(text) AGAINST('{$search}' IN BOOLEAN MODE)) as score
FROM " . DB::prefix() . "search_index
WHERE MATCH(text) AGAINST('{$search}' IN BOOLEAN MODE)
OR text LIKE '%{$search}%'
GROUP BY language_id, type, object_id
ORDER BY score DESC
LIMIT " . (int)$data['start'] . ", " . (int)$data['limit'] . "
");
$count = DB::query("SELECT FOUND_ROWS() AS total");
return [
'count' => (int)$count->row['total'],
'query' => $query->rows
];
}
这很好,但是我需要在标记
表中添加一个查询,这样它将增加分数,并为主查询中可能不存在的内容向数组中添加项目:
$tags = DB::query("
SELECT * FROM " . DB::prefix() . "tag
WHERE tag = '{$search}'
");
关于如何在主查询中实现这一点,以便我只执行一个查询,有什么想法吗?我能够将这些与联合查询结合起来:
$query = DB::query("
(SELECT
SQL_CALC_FOUND_ROWS
type, object_id, language_id,
SUM(MATCH(text) AGAINST('{$search}' IN BOOLEAN MODE)) as score
FROM " . DB::prefix() . "search_index
WHERE MATCH(text) AGAINST('{$search}' IN BOOLEAN MODE)
OR text LIKE '%{$search}%'
GROUP BY language_id, type, object_id
ORDER BY score DESC
LIMIT " . (int)$data['start'] . ", " . (int)$data['limit'] . ")
UNION DISTINCT
(SELECT
section, element_id, language_id, tag
FROM " . DB::prefix() . "tag
WHERE tag = '{$search}')
");
您想从
标记
表中检索所有列,还是只检索一列?如果您想获得单个列,可以尝试使用$search
值作为连接条件,将搜索索引
与标记
连接:搜索索引连接标记on tag.tag='$search'
。然后,也许可以使用GROUP\u CONCAT
函数以列表形式获取所需的值。试试看,让我知道它是否有效。是的,我需要从标签
中检索所有列,因为我需要匹配其他列,以确保不会重复结果。主查询是对给定文章、产品、页面等的内容和标题进行全文搜索。但是,用户可以选择添加标签,该标签可能包含在标题或内容中,也可能不包含在标题或内容中。因此,他们可能有一篇关于苹果的文章,但他们添加了一个标签imac
,即使它不在文章中,也应该找到并指向给定的苹果文章。我不确定你是否可以在一个查询中检索到所有内容。无论如何,在我看来,结果并不完全相关。也许只在一个查询中获取它们会更复杂,而且性能仍然很差。如果执行时间没有问题,我建议您坚持使用两个独立的查询。