2015-08-11 2 views
2

У меня есть следующий метод, чтобы создать поисковый запрос оценки термин поиска вхождением:объединить два 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 
     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 
    ]; 
} 

Это прекрасно работает, но мне нужно добавить в запрос к tag таблице так что это увеличит счет и добавлять элементы в массив для содержания, которое не может уже существовать в основном запросе:

$tags = DB::query(" 
    SELECT * FROM " . DB::prefix() . "tag 
    WHERE tag = '{$search}' 
"); 

Любые идеи о том, как реализовать это в основном запросе, так что я только исполняющих единственный запрос?

+0

Вы хотите, чтобы получить все столбцы из 'tag' таблицы или только один? Если вы хотите получить один столбец, вы можете попытаться присоединиться к 'search_index' с помощью' tag', используя значение '$ search' как условие соединения:' search_index join tag на tag.tag = '$ search''. Тогда, возможно, можно использовать функцию GROUP_CONCAT для получения нужного вам значения в виде списка. Попробуйте это и сообщите мне, если это сработает. –

+0

Да Мне нужно получить все столбцы из 'tag', поскольку мне нужно сопоставить другие столбцы, чтобы я не дублировал результаты. Основной запрос заключается в полнотекстовом поиске содержимого и заголовка данной статьи, продукта, страницы и т. Д. Но у пользователя есть возможность добавить тег, который может или не может быть включен в заголовок или содержимое. Таким образом, у них может быть статья об Apple, но они добавляют тег 'imac', даже если это не в статье, его все равно нужно найти и указать на данную статью Apple. –

+0

Я не уверен, что вы можете получить все в рамках одного запроса. Во всяком случае, мне кажется, что результаты не полностью связаны. Возможно, получить их только в одном запросе может быть более сложным и по-прежнему иметь низкую производительность. Если у вас нет проблем с временем выполнения, я рекомендую вам придерживаться двух разделенных запросов. –

ответ

1

я был в состоянии объединить их с UNION запросом:

$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}') 
");