I want to create a simple search engine that can count the number of properties that match on a user.
I am using a field in JSON format that lists the properties, and when the user enters a search it gets fetched as an array.
I would like to compare the input array with the number of properties that match in the JSON list.
And return the whole in two columns: the first which contains the number of tags which match. And the second which contains the list of tags that have matched.
Here is a real life example of what I’m trying to do:
I guess I have to use a combination of JSON_SEARCH and COUNT, but I can’t seem to find the correct syntax …
Advertisement
Answer
One option would be picking(JSON_EXTRACT()) the members of the match_list array iteratively within whole keys(JSON_KEYS()) of the JSON, starting from the first member(index-0) upto the length(JSON_LENGTH()) of the array in order to look up(JSON_CONTAINS()) whether exists within the JSON column (tags). I’ve used information_schema.tables in order to create an iteration as in the following query :
SET @match_list = '["talkative","cooker"]';
SELECT COALESCE( SUM( matched), 0 ) AS match_count
FROM
(
SELECT @i := @i + 1 AS rn,
JSON_CONTAINS(JSON_KEYS(tags),
JSON_EXTRACT(@match_list, CONCAT('$[',@i-1,']')),
'$') AS matched
FROM information_schema.tables
CROSS JOIN t
CROSS JOIN (SELECT @i := 0) r
WHERE @i < JSON_LENGTH(@match_list)
) q;
match_count
-----------
2
