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。我的查询有什么问题?
发布于 2019-11-13 10:12:42
我不知道你的代码不能工作的确切原因,但一个变通办法是对子查询应用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
);请注意,在没有ORDER BY的情况下使用LIMIT通常不是一个定义良好的东西。理想情况下,您还应该向子查询添加一个ORDER BY子句。
发布于 2019-11-13 10:12:10
你需要在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);https://stackoverflow.com/questions/58829302
复制相似问题