【问题标题】:Query specific text inside json text data in MYSQL在MYSQL中查询json文本数据里面的特定文本
【发布时间】:2021-05-01 01:16:51
【问题描述】:

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

+-----------+
| 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"}]|
+-------------------------+

这是我尝试过的 #1 查询:

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]);

我从这两个查询中得到的结果是什么, 我怎样才能进行这种类型的查询(以及如果使用 codeigniter 3)?

【问题讨论】:

  • #2(没有反引号)应该可以工作。如果不是,则可能不是LIKE...
  • @Benni 你是指上面的查询#2 吗?已经试过了,一无所获
  • 我测试了确切的查询(在普通的 MySql 中,而不是 codeigniter),它工作正常
  • MySQL 可以在 JSON 文本中查询,例如:SELECT * FROM 't_transaction' WHERE reviewed_by->>'$.company' = 'AAA' AND reviewed_by->>'$.review' = 'Need Review';
  • 如果您对数据库设计有任何控制权,请不要将 JSON 存储在单个列下,而是将所有这些 JSON 键设为单独的列。它不仅会使您的搜索更容易,而且效率也更高。

标签: php mysql json codeigniter


【解决方案1】:

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

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

有不同的方法来选择你想要的。我会给你两个选择,它们各有利弊。看看this stackoverflow

使用 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";

【讨论】:

    猜你喜欢
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多