У меня есть база данных SQL с музыкальными композициями. У каждой песни, конечно, есть художник, альбом и жанр. У них также есть общий счетчик «популярности», который был получен из внешнего источника. Тем не менее, я хочу дать пользователям возможность проголосовать и за песни. В конце концов, результаты поиска должны быть упорядочены по этой популярности, а также точность результатов с исходным запросом.Как сортировать и фильтровать поиск по нескольким полям в SQL
Текущий запрос я использую следующим образом:
SELECT *
FROM p2pm_tracks
WHERE
`artist` LIKE '%$searchquestion%' OR
`genres` LIKE '%$searchquestion%' OR
`trackname` LIKE '%$searchquestion%' OR
`album_name` LIKE '%$searchquestion%'
ORDER BY `popularity` DESC
LIMIT $startingpoint, $resultsperpage
борюсь со следующим:
- Пользователи ищут что-то. Я смотрю во всех полях: песня название, художник, альбом и жанр. Однако обычно определенный поисковый запрос содержит (части) несколько этих треков.
Например, пользователь может найти Opening Philip Glass
.
В этом случае первого словом является названия песни, а второе и третье слова названия художника.
Другой пример:
Если я разбить запрос на пространствах, правильные следы найдены. Однако, если другой трек, который соответствует только одному из этих слов, имеет большую популярность, он будет возвращен до того, который действительно точно соответствует поисковому запросу.
Я по-прежнему хочу сортировать результаты таким образом, чтобы вещи, которые соответствуют более крупным частям запроса, находятся на вершине. Как я могу это сделать с помощью SQL?
- У меня статическая популярность и вы хотите создать новую. Поэтому я хочу использовать среднее количество всех голосов на определенном треке (эти голоса хранятся в другой таблице), за исключением случаев, когда голоса еще нет. Как я могу построить SQL-запрос, который делает это?
Мое приложение построено в PHP, но я хотел бы сделать как можно больше этого в SQL, предпочтительно в качестве нескольких запросов, как это возможно, чтобы уменьшить время ожидания.
Любая помощь будет оценена по достоинству.
SQL - это не лучший способ добиться этого. Текстовая поисковая система (например, Solr Lucene) является гораздо лучшим способом, особенно если вы разрешаете поиск, например, «открытие стеклянного стекла». Некоторые РСУБД (например, SQL Server) имеют встроенные полнотекстовые двигатели и могут быть подходящими. –
Также обратите внимание, что ваш запрос MySQL сейчас уязвим для SQL-инъекции таким образом. Всегда избегайте ваших запросов. –
Вы можете сортировать его на стороне сервера, используя levenstein http://php.net/manual/en/function.levenshtein.php – Ruben