查询 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";
我想从下面的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";