查询 json 中的特定文本 MYSQL 中的文本数据

Query specific text inside json text data in MYSQL

我想从下面的reviewed_by table查询“公司”是“AAA”,“审核”是“需要审核” 这是 mysql table :

+-----------+
| DATA_TYPE |
+-----------+
| text      |
+-----------+

+-------------------------+
| reviewed_by             |
+-------------------------+
|[{"company":"AAA","review":"OK","reviewed_at":"2021-01-26 08:59:26"}]|
|[{"company":"BBB","review":"OK","reviewed_at":"2021-01-26 08:59:26"}]|
|[{"company":"AAA","review":"Need Review","reviewed_at":"N\/A"}]|
+-------------------------+

这是我试过的排名第一的查询:

SELECT * FROM `t_transaction` 
WHERE `reviewed_by` 
LIKE '%`"company":"AAA","review":"Need Review"`%'

这是我试过的 #2 查询:

SELECT * FROM `t_transaction` 
WHERE `reviewed_by` 
LIKE '%"company":"AAA","review":"Need Review"%'

ci3 查询:

$like = ['reviewed_by','"company":"AAA","review":"Need Review"'];
$this->db->select('*')   
         ->from('t_transacion')
         ->group_by('id')
         ->like($like[0],$like[1]);

我从这 2 个查询中得到的结果是什么, 我该如何进行这种类型的查询(如果使用 codeigniter 3 也是如此)?

MySql 有一些函数可以让您在 json 字段上进行搜索。 See documentation.

reviewed_by 列是一个 json 数组,您想要搜索该数组的第一个元素。使用函数 JSON_EXTRACT 您可以从 json 字段中提取数据。在您的情况下,要在数组的第一个位置获得 json,因此我们执行 JSON_EXTRACT(reviewed_by, '$[0]'),这将 return {"company":"...","review":"..","reviewed_at":"..."}。从 returned json 我们可以再次调用 JSON_EXTRACT 函数来获取给定键的值。如果我们 select JSON_EXTRACT(JSON_EXTRACT(reviewed_by, '$[0]'), "$.company") 这将 return 来自 json.

的公司价值

有多种方法可以select您想要的。我会给你两个选择,它们各有利弊。看看this Whosebug.

使用 where 子句的第一种方法:

SELECT reviewed_by
FROM t_transaction
WHERE JSON_EXTRACT(JSON_EXTRACT(reviewed_by, '$[0]'), "$.company") = "AAA"
  AND JSON_EXTRACT(JSON_EXTRACT(reviewed_by, '$[0]'), "$.review") = "Need Review";

使用 having 子句的第二种方法:

SELECT JSON_EXTRACT(reviewed_by, '$[0]') AS json
FROM t_transaction
HAVING json -> "$.company" = "AAA"
   AND json -> "$.review" = "Need Review";