Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.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搜索查询_Php_Mysql - Fatal编程技术网

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
,即使它不在文章中,也应该找到并指向给定的苹果文章。我不确定你是否可以在一个查询中检索到所有内容。无论如何,在我看来,结果并不完全相关。也许只在一个查询中获取它们会更复杂,而且性能仍然很差。如果执行时间没有问题,我建议您坚持使用两个独立的查询。