为什么使用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。我的查询出了什么问题?

zhanghang921224 回答:为什么使用JSON_ARRAYAGG进行SELECT时会忽略LIMIT?

您需要先使用子查询才能在limit之前aggregating使用结果。

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);
,

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

SET countt = PAGE_ * 5 - 5;

SET @data = (
    SELECT JSON_ARRAYAGG(JSON_OBJECT('id',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子句。

本文链接:https://www.f2er.com/3113238.html

大家都在问