【问题标题】:JSON to MYSQL with nested queries带有嵌套查询的 JSON 到 MYSQL
【发布时间】:2020-08-19 02:14:35
【问题描述】:

寻找您将复杂的嵌套 MYSQL 查询转换为 JSON 文件的经验。下面是代码。

SELECT post_id
     , name
     , Email
     , CustomerId
     , DeliveryDate
     , DeliveryTime
     , DeliveryType
     , Zip
     , OrderNote
     , PaymentTotal
     , OrderStatus
  FROM ( SELECT t1.post_id
              , t2.name
              , MAX(CASE WHEN meta_key = 'value' THEN meta_value ELSE NULL END) as Email
              , MAX(CASE WHEN meta_key = 'value' THEN meta_value ELSE NULL END) as CustomerId
              , MAX(CASE WHEN meta_key = 'value' THEN meta_value ELSE NULL END) as DeliveryDate
              , MAX(CASE WHEN meta_key = 'value' THEN meta_value ELSE NULL END) as DeliveryTime
              , MAX(CASE WHEN meta_key = 'value' THEN meta_value ELSE NULL END) as DeliveryType
              , MAX(CASE WHEN meta_key = 'value' THEN meta_value ELSE NULL END) as Zip
              , MAX(CASE WHEN meta_key = 'value' THEN meta_value ELSE NULL END) as OrderNote
              , MAX(CASE WHEN meta_key = 'value' THEN meta_value ELSE NULL END) as PaymentTotal
              , MAX(CASE WHEN meta_key = 'value' THEN meta_value ELSE NULL END) as OrderStatus
           FROM table_A t1
         INNER 
           JOIN table_B t2 
             ON FIND_IN_SET(t1.post_id, t2.payment_ids)  
         GROUP 
             BY t1.post_id
              , t2.name  
       ) AS derived_table
 WHERE OrderStatus RLIKE '%trans%|ready'
   AND DeliveryDate >= CURRENT_DATE - INTERVAL 7 DAY
   AND DeliveryType = 'pickup'

既然这必须从 SELECT 开始,有没有办法将它正确地转换为 JSON,它会是什么样子?据我了解,JSON 不喜欢从 SELECT 开始

【问题讨论】:

  • 你用的是什么版本的 MySQL?
  • 我认为所有的 'value' 字符串实际上是不同的,并且代表您尝试提取的值的适当键?
  • 更正。 'value' 是一个占位符,所以我的回答不是那么具体。我正在运行 5.7.3
  • 谢谢,我很想投票,但没有足够的业力投票。它说,谢谢您的回复已被记录但不算数

标签: mysql sql json select


【解决方案1】:

您可以使用JSON_OBJECT 从查询生成的每一行中创建一个 JSON 对象。然后需要将这些对象收集到一个数组中。由于您没有使用 MySQL 8+,因此您需要使用 GROUP_CONCAT 来模拟 JSON_ARRAYAGG。例如(为简单起见,我省略了部分查询):

SELECT CONCAT('[', GROUP_CONCAT(obj), ']') AS JSON
FROM (
    SELECT JSON_OBJECT('post_id', post_id
                     , 'name', name
                     , 'Email', Email
                     , 'CustomerId', CustomerId
                       -- ...
                      ) AS obj
    FROM (SELECT t1.post_id
               , t2.name
               , MAX(CASE WHEN meta_key = 'value' THEN meta_value ELSE NULL END) as Email
               , MAX(CASE WHEN meta_key = 'value' THEN meta_value ELSE NULL END) as CustomerId
               -- ...
          FROM table_A t1
          INNER JOIN table_B t2 ON FIND_IN_SET(t1.post_id, t2.payment_ids)  
          GROUP BY t1.post_id, t2.name  
    ) AS derived_table
    WHERE OrderStatus RLIKE '%trans%|ready'
      AND DeliveryDate >= CURRENT_DATE - INTERVAL 7 DAY
      AND DeliveryType = 'pickup'
) j

demo on dbfiddle

【讨论】:

  • 谢谢。迁移到 MYSQL 8 有什么主要优势吗?
  • @Tim 有很多优点,尤其是在使用 CTE 和窗口函数时,虽然对于这个查询它不会有太大的区别,你只需将第一行更改为 SELECT JSON_ARRAYAGG(obj)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多