Currently using MYSQL 5.7, soon to be migrating to 8.0. We have a json field in our database which has values which look like this:
[
  {
     "first_name":"bob",
     "last_name":"lisserman"
  },
  {
     "first_name":"bob",
     "last_name":"rippleman"
  },
  {
     "first_name":"joe",
     "last_name":"roterlam"
  }
]
I’m trying to write a query which finds records which contain an object in the array with both “first_name” = “bob” AND “last_name” = “rippleman”
Does JSON_CONTAINS support a search like this?
Advertisement
Answer
12.17.3 Functions That Search JSON Values :: JSON_CONTAINS(target, candidate[, path]):
…
- A candidate object is contained in a target object if and only if for each key in the candidate there is a key with the same name in the target and the value associated with the candidate key is contained in the value associated with the target key.
 …
MySQL 5.7 and MySQL 8.0 try:
SELECT
  `id`,
  `json_field`
FROM
  `tbl_table`
WHERE
  JSON_CONTAINS(`json_field`, '{"first_name": "bob", "last_name": "rippleman"}');
See dbfiddle.
MySQL 8.0 try:
SELECT
  `tbl_table`.`id`,
  `tbl_table`.`json_field`
FROM
  `tbl_table`, JSON_TABLE(
    `json_field`,
    '$[*]'
    COLUMNS(
      `first_name` VARCHAR(50) PATH '$.first_name',
      `last_name` VARCHAR(50) PATH '$.last_name'
    )
) `der`
WHERE
  `der`.`first_name` = 'bob' AND
  `der`.`last_name` = 'rippleman';
See dbfiddle.