#php #mysql #sorting
Вопрос:
Стол :
id title
1. php is a good language.
2. Java is a good language
3. All language are good
4. Php,Java both good language
5. Php is good but Java is not
Вопрос
строка: $#
$string = "php Java language"
Порядок Результатов
php ,Java both good language
-------------------------
php is good Java is not
-------------------------
php is good language
---------------------------
Java is good language
------------------------
all language are good
Я понятия не имею, как получить список заказов по количеству слов, совпадающих в строке.
Было бы здорово, если бы вы объяснили запрос.
Спасибо.
Ответ №1:
Преобразуйте свою строку в массив JSON, затем
SELECT test.id, test.tittle
FROM test
LEFT JOIN JSON_TABLE(@criteria,
"$[*]" COLUMNS (word VARCHAR(255) PATH "$")) jsontable ON LOCATE (jsontable.word, test.tittle)
GROUP BY test.id, test.tittle
ORDER BY SUM(jsontable.word IS NOT NULL) DESC
@criteria
является заполнителем для массива JSON, упомянутого выше.
Конечно, вы можете указать свои критерии в виде строки, разделенной пробелами, и преобразовать ее в JSON в запросе с помощью строковых функций.
Версия без использования JSON:
WITH RECURSIVE
cte AS (SELECT test.id,
test.tittle,
0 amount,
TRIM(TRIM(LEADING SUBSTRING_INDEX(@criteria, ' ', 1) FROM @criteria)) criteria,
SUBSTRING_INDEX(@criteria, ' ', 1) token
FROM test
UNION ALL
SELECT id,
tittle,
amount (LOCATE(token, tittle) > 0),
TRIM(TRIM(LEADING token FROM criteria)),
SUBSTRING_INDEX(criteria, ' ', 1)
FROM cte
WHERE TRIM(criteria) != '' )
SELECT id, tittle
FROM cte
GROUP BY id, tittle
ORDER BY MAX(amount) DESC;
https://dbfiddle.uk/?rdbms=mysql_8.0amp;fiddle=3ab611ed7429e23be2abfcb8b0186e6d
Комментарии:
1. Можете ли вы сделать это без json
2. @Перепутать я могу. Решение зависит от: точной версии MySQL; макс. количество токенов на строку критериев.
3. последняя версия MySQL . Можете ли вы объяснить строчный запрос?
4. И мне нужен простой запрос без json. Где я могу реализовать другие условия, например, если у двух строк одинаковое «нет». слов, затем отсортируйте по идентификатору и т. Д.
5. @MixUp последняя версия MySQL , если это так, то сделать это без json означает «предоставить критерии как разделенные пробелами, как есть», не так ли? Если нет, то рекурсивный CTE необходим — это полезно для вас?