【问题标题】:how can i get mysql to return an array that is inside JSON我如何让 mysql 返回 JSON 中的数组
【发布时间】:2021-08-31 08:03:36
【问题描述】:

我正在尝试退回每个产品可以包含三张图片的产品。 像这样:

{
product_id: 1,
product_name:"test",
category_id_fk: 1,
product_price: 12,
product_desc:"lorem-ipsum",
product_images:[path1, path2, path3]
}

这是我到目前为止所得到的,

create table product(
product_id serial not null primary key,
category_id_fk int not null references category(category_id) ,
product_image_fk int not null references product_images(product_images_id),
product_name varchar(50) not null,
product_price int not null,
product_desc varchar(200) not null);

create table product_images(
product_images_id serial not null primary key,
product_image_one varchar(150) not null,
product_image_two varchar(150) not null,
product_image_three varchar(150) not null);

这是我用于产品详细信息页面的查询

SELECT * FROM product WHERE category_id_fk = ?  AND product_id = ?;

我是 SQL 新手,特别是在这方面真的很艰难,我会 如果有人能向我解释我做错了什么或者你有什么建议给我,我将不胜感激。

【问题讨论】:

  • 向 INSERT INTO 提供必须生成所需 JSON 的示例数据。
  • 通常创建 JSON 字符串不是数据库任务。即使可能有一些黑客攻击,这通常也应该由您的后端代码完成。您应该将图像表的设计更改为每行只有一张图像。
  • @ClausBönnhoff 通常创建 JSON 字符串不是数据库任务。 ??通常数据处理是 DBMS 任务。如果处理结果必须是 JSON 格式,那么 DBMS 必须是 JSON。 MySQL 拥有完成这项任务所需的所有工具。
  • 附言。 column_fk int not null references table (column_id) 不创建外键!!! - references 子句被解析但被忽略。要创建外键关系,请使用单独的 FK 定义。
  • @Akina 我不喜欢这种将程序 Logik 放入 DBMS 的新浪潮。这会降低您更改数据库类型的灵活性,并增加对 dB 服务器的硬件性能的需求。对我来说,数据库应该是一个数据提供者,不多也不少。但我知道我很孤单:)

标签: mysql json


【解决方案1】:

我不知道您使用的是哪种编程语言,但在这种情况下,我假设您使用 PHP 之类的编程语言作为 REST API 提供程序,因为您使用的是准备好的语句 这是查询:

SELECT * FROM `product_images` `pi` LEFT JOIN `product` `p`
ON `pi`.`product_images_id` = `p`.`product_image_fk` WHERE
`p`.`product_id` = ? AND `p`.`category_id_fk` = ?

然后在你的 PHP 脚本上你可以这样:

$sql = "SELECT * FROM `product_images` `pi` LEFT JOIN `product` `p`
ON `pi`.`product_images_id` = `p`.`product_image_fk` WHERE
`p`.`product_id` = ? AND `p`.`category_id_fk` = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ii", $productId, $categoryId);
$stmt->execute();
$row = $stmt->get_result()->fetch_assoc();
$jsonArray = [
    "product_id" => $row["product_id"],
    "product_name" => $row["product_name"],
    "category_id_fk" => $row["category_id_fk"],
    "product_price" => $row["product_price"],
    "product_desc" => $row["product_desc"],
    "product_images" => [$row["product_image_one"], $row["product_image_two"], $row["product_image_three"]]
];
$expectedJson = json_encode($jsonArray);

你可以对 json 做任何你想做的事情,也许通过将它存储在 json 文件中或将它打印为 http 响应

【讨论】:

  • 从不使用 select *
【解决方案2】:
SELECT JSON_OBJECT( 'product_id', p.product_id,
                    'product_name', p.product_name,
                    'category_id_fk', p.category_id_fk,
                    'product_price', p.product_price,
                    'product_desc', p.product_desc,
                    'product_images', JSON_ARRAY(pi.product_image_one,
                                                 pi.product_image_two,
                                                 pi.product_image_three) ) output
FROM product p
JOIN product_images pi ON p.product_image_fk = pi.product_images_id;

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=16f3a1fe3619c6c3601983d4c00de07d

【讨论】:

  • 谢谢,这很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
  • 2011-04-11
  • 2019-07-07
相关资源
最近更新 更多