mysql 从具有多个数组值的列中选择一个值

hc2pp10m  于 2023-01-01  发布在  Mysql
关注(0)|答案(4)|浏览(121)

我有一个名为“Student_fees_存款”的表,在该表中,一列包含多个值。

学费存款

id | amount_detail
---|----------------
 1 |{"1"{"amount":"5000.00","date":"2022-12-15","amount_discount":"5000.00"}}           
 2 | {"1":{"amount":"9000.00","date":"2022-12-15","amount_discount":"5000.00"}}

我怎样才能得到id = 1的金额值5000.00?

smdncfj3

smdncfj31#

SELECT JSON_EXTRACT(JSON_EXTRACT(amount_detail,'$."1"'), '$.amount') FROM `Student_fees_deposit` WHERE id = 1;

您的第一个条目中有一处打字错误,缺少“:“

f3temu5u

f3temu5u2#

该数据类型是JSON。
MariaDB从10.2.7开始支持JSON,并且有很多functions可供使用。
MySQL从5.7.8their document)开始支持JSON,并且有很多functions可供使用。
它们之间有一些区别-例如:MariaDB do not support column path operator->->>)。因此,您只能在MySQL上使用此函数。
您可以使用此SQL语句获取值。

SELECT JSON_VALUE(`amount_detail`, '$.*.amount') AS `extracted` FROM `your_table` WHERE `id` = 1

JSON_VALUE()JSON_EXTRACT()之间的区别在于JSON_EXTRACT()在结果中包含双引号和方括号([".."])。(使用MariaDB测试)

SELECT JSON_EXTRACT(`amount_detail`, '$.*.amount') AS `extracted` FROM `your_table` WHERE `id` = 1

结果(MariaDB):
【"5000.00"】

SELECT JSON_VALUE(`amount_detail`, '$.*.amount') AS `extracted` FROM `your_table` WHERE `id` = 1

结果:
5000.00
PHP中的示例代码。

$sql = 'SELECT *, JSON_VALUE(`amount_detail`, \'$.*.amount\') AS `extracted` FROM `your_table` WHERE `id` = 1';
$sth = $dbh->prepare($sql);
$sth->execute();
$result = $sth->fetchAll();

foreach ($result as $row) {
    echo 'ID: ' . $row->id;
    echo ' ; ';
    echo 'amount: ' . $row->extracted;
    echo '<br>';
}
q8l4jmvw

q8l4jmvw3#

您可以使用substring_index()

select *, substring_index(SUBSTRING_INDEX(amount_detail,'amount":"',-1), '"', 1) as amount
 from Student_fees_deposit
 where id = 1;
8wtpewkr

8wtpewkr4#

这能回答你的问题吗?

SELECT * FROM student_fees_deposit WHERE id = 1 AND amount_detail LIKE '%"amount": "5000.00"%';

实际上,您不应该在数据库中存储JSON,我宁愿放置3个单独的列(amountdateamount_discount),而不是存储JSON,因为对JSON数据运行复杂的查询非常困难,而且它往往会违反规范化规则。
只需将JSON拆分为单独的列,您就可以轻松地重新构建表,使其更易于维护、更有结构,并且总体上更客观。
将来应该避免的另一件事是将Arrays存储在数据库中,因为这可以很容易地用1:M关系实现,它也可以强制执行规范化规则3。
下面是我在自己的数据库上尝试的一个工作测试:

SELECT _message FROM _messages WHERE _message LIKE '%"amount":"5000.00"%';
+---------------------------------------------------------------------------+
| _message                                                                  |
+---------------------------------------------------------------------------+
| {"1"{"amount":"5000.00","date":"2022-12-15","amount_discount":"5000.00"}} |
+---------------------------------------------------------------------------+

相关问题