Извлечение затронутой таблицы при полнотекстовом поиске - PullRequest
1 голос
/ 30 мая 2011

Я ищу в 3 разных таблицах полнотекстовый поиск, и мне нужно определить, из какой таблицы исходит результат. Вот что у меня сейчас:

SELECT id, title AS page_title, MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) AS score FROM pages WHERE MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) UNION
SELECT id, title AS agenda_title, MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) AS score FROM agenda WHERE MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) UNION
SELECT id, title AS news_title, MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) AS score FROM news WHERE MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) ORDER BY score ASC

Я обнаруживаю, был ли задан заголовок страницы, а если нет, то был ли задан заголовок повестки дня и т. Д. Но результат всегда из первого запроса (страницы). Поэтому, если посетитель будет искать и находить новость, в этом случае он будет отображаться как страница.

Итак, мой вопрос; Что я делаю неправильно? И это лучший способ сделать это?

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 30 мая 2011

Когда вы используете UNIONs таким образом, добавьте столбец определителя, просто константу, к каждой таблице, чтобы вы знали, из какой таблицы происходит каждая запись.

SELECT source, id, title, score
    FROM
    (SELECT 'pages' AS source, id, title, MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) AS score
        FROM pages WHERE MATCH(title) AGAINST(:search_term IN BOOLEAN MODE)
    UNION
    SELECT 'agenda' AS source, id, title, MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) AS score 
        FROM agenda WHERE MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) UNION
    SELECT 'news' AS source, id, title, MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) AS score 
        FROM news WHERE MATCH(title) AGAINST(:search_term IN BOOLEAN MODE)
) ORDER BY score ASC

Вам также нужно будет обернуть его от SELECT до ORDER BY по всему комбинированному набору, так, как вы это сделали, порядок будет только на последнем столе, я думаю. Изменение атрибута title также не является хорошей идеей, поскольку имена столбцов должны быть одинаковыми для UNION, или они объединят их с первым найденным заголовком, или просто очистят имя столбца.

1 голос
/ 30 мая 2011

Попробуйте запрос типа:

SELECT 'pages' AS used_table,id, title, MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) AS score FROM pages WHERE MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) UNION
SELECT 'agenda' AS used_table,id, title , MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) AS score FROM agenda WHERE MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) UNION
SELECT 'news' AS used_table,id, title , MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) AS score FROM news WHERE MATCH(title) AGAINST(:search_term IN BOOLEAN MODE) ORDER BY score ASC

и проверьте поле used_table, чтобы проверить, была ли использована таблица ведьм.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...