Table :
JavaScript
x
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
Question
string: $#
JavaScript
$string = "php Java language"
Result Order
JavaScript
php ,Java both good language
-------------------------
php is good Java is not
-------------------------
php is good language
---------------------------
Java is good language
------------------------
all language are good
I have no idea how to achive the order list by how many words are matched in string.
It will be great if you explain the query.
Thank you.
Advertisement
Answer
Convert your string to JSON array then
JavaScript
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
is a placeholder for JSON array mentioned above.
Of course, you may provide your criteria as space-separated string and convert it to JSON in the query using string functions.
The version without JSON usage:
JavaScript
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.0&fiddle=3ab611ed7429e23be2abfcb8b0186e6d