Search code examples
mysqlsqlmysql-json

MySQL - How to find number of occurance in JSON?


I have following table -

+-----+-----------+--------------------------------------+
| id  | client_id | service_values                       |
+-----+-----------+------------+-------------------------+
| 100 |      1000 | {"1": "60", "2": "64", "3": "92"}    |
| 101 |      1000 | {"1": "66", "2": "64", "3": "92"}    |
| 102 |      1000 | {"1": "70", "2": "64", "3": "92"}    |
| 103 |      1001 | {"1": "60", "2": "54", "3": "92"}    |
| 104 |      1001 | {"1": "90", "2": "64", "3": "92"}    |
| 105 |      1002 | {"1": "80", "2": "64", "3": "92"}    |
+-----+-----------+--------------------------------------+

I need to fetch service_values where 2 or more values is LESS THAN 65. For example from the above records, the expected result would be -

    +-----+-----------+--------------------------------------+
    | id  | client_id | service_values                       |
    +-----+-----------+------------+-------------------------+
    | 100 |      1000 | {"1": "60", "2": "64", "3": "92"}    |
    | 103 |      1001 | {"1": "60", "2": "54", "3": "92"}    |
    +-----+-----------+--------------------------------------+

I find a lot but couldn't find anything to perform aggregate function in JSON data.

Update - I tried something like this but couldn't succeed -

SELECT JSON_UNQUOTE(JSON_EXTRACT(service_values,'$.1')) AS A1, JSON_UNQUOTE(JSON_EXTRACT(service_values,'$.2')) AS A2, JSON_UNQUOTE(JSON_EXTRACT(service_values,'$.3')) AS A3 FROM service_data HAVING A1 < 65 OR A2 < 65 OR A3 < 65

Solution

  • SELECT *
    FROM test
    WHERE (JSON_UNQUOTE(JSON_EXTRACT(service_values, "$.1")) < 65) 
         +(JSON_UNQUOTE(JSON_EXTRACT(service_values, "$.2")) < 65) 
         +(JSON_UNQUOTE(JSON_EXTRACT(service_values, "$.3")) < 65) >= 2;
    

    https://dbfiddle.uk/?rdbms=mariadb_10.4&fiddle=ea41cb428cbe356c9f98a99f59ca37dc