Как отсортировать результат mysql?

#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 необходим — это полезно для вас?