Как упорядочить результаты по количеству совпадений с поисковыми запросами? - PullRequest
0 голосов
/ 11 марта 2010

Я использую следующие таблицы InnoDB в mysql для описания записей, которые могут иметь несколько поисковых тегов, связанных с ними:

TABLE records
    ID
    title
    desc

TABLE searchTags
    ID
    name

TABLE recordSearchTags
    recordID
    searchTagID

Чтобы выбрать записи, основанные на произвольных входных данных поиска, у меня есть утверждение, которое выглядит примерно так:

SELECT 

    recordSearchTags.recordID

FROM 

    recordSearchTags

LEFT JOIN searchTags 

ON recordSearchTags.searchTagID = searchTags.ID 

WHERE 

    searchTags.name LIKE CONCAT('%','$search1','%') OR
    searchTags.name LIKE CONCAT('%','$search2','%') OR
    searchTags.name LIKE CONCAT('%','$search3','%') OR
    searchTags.name LIKE CONCAT('%','$search4','%');

Я бы хотел ЗАКАЗАТЬ этот набор результатов, чтобы строки, соответствующие большему количеству поисковых терминов, отображались перед строками, которые соответствуют меньшему количеству поисковых терминов.

Например, если строка соответствует всем 4 поисковым запросам, она будет первой в списке. Строка, которая соответствует только двум условиям поиска, будет где-то посередине. И строка, которая соответствует только одному поисковому запросу, будет в конце.

Любые предложения о том, как лучше всего это сделать?

Спасибо!

Ответы [ 2 ]

1 голос
/ 11 марта 2010

* Замененный ответ, поскольку полный текст не поддерживается

Хорошо, это не красиво, но вы должны быть в состоянии сделать что-то вроде этого:

ORDER BY (searchTags.name LIKE CONCAT('%','$search1','%') 
          + searchTags.name LIKE CONCAT('%','$search2','%')
          + searchTags.name LIKE CONCAT('%','$search3','%')
          + searchTags.name LIKE CONCAT('%','$search4','%'))
DESC;

LIKE возвращает 1 в случае совпадения или 0 в случае отсутствия совпадения, поэтому вы можете просто добавить результаты вместе.

0 голосов
/ 11 марта 2010

Это не очень красиво, но одним из способов было бы объединить 4 лайка в 4 утверждениях типа

select ... where  searchTags.name LIKE CONCAT('%','$search1','%')
union 
select ...

и так далее. Оберните это в:

select recordSearchTags.recordID, count(*) from (<inner unions>)
group by recordSearchTags.recordID 
order by count(*)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...