【问题标题】:Why the LIMIT are ignored when SELECT using JSON_ARRAYAGG?为什么使用 JSON_ARRAYAGG 进行 SELECT 时忽略 LIMIT?
【发布时间】:2020-03-08 18:57:28
【问题描述】:
set countt = PAGE_ * 5 - 5;

        set @data = (select JSON_ARRAYAGG(JSON_OBJECT('id', room_participants.id, 'isAdmin', room_participants.isAdmin, 'userId', room_participants.userId, 'joinTime', room_participants.joinTime, 'leftTime', room_participants.leftTime, 'status', room_participants.status, 'kickTime', room_participants.kickTime, 'displayName', users.displayName, 'phone', users.phone, 'created', created))
                        from room_participants 
                        LEFT JOIN users ON room_participants.userId = users.id 
                        WHERE room_participants.roomId = ROOMID_ LIMIT 5 OFFSET countt);

我需要上述查询以 json_arrayagg 格式仅显示限制为 5 个数据,但它返回给我的整个数据不限制为 5。我的查询有什么问题?

【问题讨论】:

    标签: mysql stored-procedures mysql-workbench


    【解决方案1】:

    在aggregating 之前,您需要先使用子查询来limit 您的结果。

    set countt = PAGE_ * 5 - 5;
    
    set @data = (select JSON_ARRAYAGG(JSON_OBJECT('id', id, 'isAdmin'
                    , isAdmin, 'userId', userId, 'joinTime'
                    , joinTime, 'leftTime', leftTime
                    , 'status', status, 'kickTime', kickTime
                    , 'displayName', displayName, 'phone', phone, 'created', t.dCreated)
                )
                from 
                (select t1.*, t2.*, t1.created as dCreated from room_participants t1 
                    left join users t2 on t1.userId = t2.id 
                    where t1.roomId = ROOMID_ limit 5 offset countt) t);
    

    【讨论】:

      【解决方案2】:

      我不知道您的代码无法正常工作的确切原因,但一种解决方法是将LIMIT 应用于子查询,然后基于此形成 JSON:

      SET countt = PAGE_ * 5 - 5;
      
      SET @data = (
          SELECT JSON_ARRAYAGG(JSON_OBJECT('id', id, 'isAdmin', isAdmin, 'userId', userId, 'joinTime', joinTime, 'leftTime', leftTime, 'status', status, 'kickTime', kickTime, 'displayName', displayName, 'phone', phone, 'created', created))
          FROM
          (
              SELECT rp.id, rp.isAdmin, rp.userId, rp.joinTime, rp.leftTime, rp.status,
                     rp.kickTime, u.displayName, u.phone, created
              FROM room_participants rp
              LEFT JOIN users u ON rp.userId = u.id 
              WHERE rp.roomId = ROOMID_
              LIMIT 5 OFFSET countt
          ) t
      );
      

      请注意,使用 LIMIT 而不使用 ORDER BY 通常不是一个明确定义的事情。理想情况下,您还应该在子查询中添加 ORDER BY 子句。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-19
        • 2015-01-25
        • 2020-10-22
        • 1970-01-01
        • 2012-05-10
        • 2020-01-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多