首页 > 解决方案 > 为什么使用 JSON_ARRAYAGG 进行 SELECT 时忽略 LIMIT?

问题描述

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。我的查询有什么问题?

标签: mysqlstored-proceduresmysql-workbench

解决方案


我不知道您的代码不起作用的确切原因,但一种解决方法是应用于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
);

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


推荐阅读