【问题标题】:SQL Query Result as JSONSQL 查询结果为 JSON
【发布时间】:2020-09-26 11:30:26
【问题描述】:

我正在尝试以 JSON 格式获取查询结果。 我的想法是在每个类别中获取菜单的所有项目 我需要的 JSON 是这样的:

{
  "menu": {
      "category": [
          {
            "id": 1,
            "description": "Category 1 Description",
            "items" : [
                {
                  "id" : 1,
                  "item_name" : "Item name 1",
                  "price": 200
                },
                {
                  "id": 2,
                  "item_name" : "Item name 1",
                  "price": 200 
                }
              ]
          },
          {
            "id": 2,
            "description": "Category 1 Description",
            "items": [
                {
                  "id": 1,
                  "item_name" : "Item name 1",
                  "price": 200
                },
                {
                  "id": 2,
                  "item_name" : "Item name 1",
                  "price": 200
                },
                {
                  "id": 3,
                  "item_name" : "Item name 1",
                  "price": 200
                }
              ]
          }
        ]
  }
}

SQL 小提琴图片:SQL Fiddle 我实际得到的表:

-- ----------------------------
-- Table structure for menu_category
-- ----------------------------
DROP TABLE IF EXISTS `menu_category`;
CREATE TABLE `menu_category` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `description` varchar(255) NOT NULL,
  `image` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for menu_items
-- ----------------------------
DROP TABLE IF EXISTS `menu_items`;
CREATE TABLE `menu_items` (
  `id` int NOT NULL AUTO_INCREMENT,
  `id_category` int DEFAULT NULL,
  `item_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `small_description` varchar(255) DEFAULT NULL,
  `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `price` decimal(10,2) DEFAULT NULL,
  `rating` decimal(10,2) DEFAULT NULL,
  `image` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=utf8;

SET FOREIGN_KEY_CHECKS = 1;

我已经尝试了几个查询,但没有成功。 如何编写查询以获取与我发布的 JSON 一样的 JSON? 提前致谢!

【问题讨论】:

  • 你不能在查询中这样做,你必须在代码本身中转换它
  • SELECT JSON_ARRAYAGG(JSON_OBJECT('menu', JSON_ARRAY('id', menu_category.id, 'description', menu_category.description, JSON_ARRAY('items', menu_items.item_name)))) from menu_category INNER JOIN menu_items ON menu_category.id = menu_items.id_category GROUP BY menu_category.id 我试过类似的方法
  • 最终结果仍然是一个数组
  • 如果您可以在 SQL fiddle 中提供,那么提供解决方案将很容易
  • 我在帖子中添加了 SQL Fiddle Scheme

标签: mysql sql json


【解决方案1】:

为了获得想要的结果,您可以使用 JSON_OBJECTJSON_ARRAYAGG 函数,例如:

SELECT
    JSON_OBJECT(
      'id', `mc`.`id`,
      'description', `mc`.`description`,
      'items', 
        JSON_ARRAYAGG(
          JSON_OBJECT(
            'id', `mi`.`id`,
            'item_name', `mi`.`item_name`,
            'price', `mi`.`price`
          )
        )
) `menu`
FROM `menu_category` `mc` 
JOIN `menu_items` `mi` ON `mi`.`id_category` = `mc`.`id`
GROUP BY `mc`.`id`;

查询返回下一个结果:

{
  "id": 1,
  "description": "Category 1 Description",
  "items": [
    {
      "id": 1,
      "price": 100.00,
      "item_name": "Item 1 name"
    }, {
      "id": 2,
      "price": 100.00,
      "item_name": "Item 2 name"
    }
  ]
}

要向 JSON 添加另一个数据,您可以修改查询 here

【讨论】:

  • 如果我在 SQL 上运行查询,我会以这种方式得到 JSON,而不像你的帖子:paste2.org/4kdm769N
  • 对不起。我忘记将JSON_ARRAY 更改为JSON_OBJECT。现在修好了。再试一次
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 2013-02-24
  • 1970-01-01
  • 2021-02-17
相关资源
最近更新 更多