目前,我正在使用以下SQL查询来查找用户所在的房间以及这些房间中的其他用户:
SELECT r1.room, r2.user
FROM
rooms r1 JOIN rooms r2 ON r2.room = r1.room
WHERE r1.user='foobar'
样品室表:
room | user
a | user1
b | user1
c | user1
a | user2
a | user3
a | user4
我想将同一房间的其他用户部分限制为每个房间返回50个用户,但不限制房间数量。这可能在一个查询中吗?
user1的响应示例(假设我想将其限制为每个房间返回3个用户):
a, user1
a, user2
a, user3
b, user1
c, user1
答案 0 :(得分:2)
可以通过一些有趣的参数使用和派生表的嵌套来实现:
SET @user = 'user1';
SELECT
calclist.room,
calclist.user
FROM
(
SELECT
joinedlist.room 'room'
, joinedlist.user 'user'
, IF(joinedlist.room=@room, @rownum:=@rownum+1, @rownum:=1) 'count'
, (@room:=joinedlist.room) dummy
FROM
(
SELECT
roommate_rooms.room,
roommate_rooms.user
FROM
rooms user_rooms
INNER JOIN rooms roommate_rooms
ON user_rooms.room = roommate_rooms.room
WHERE user_rooms.user = @user
ORDER BY
roommate_rooms.room,
roommate_rooms.user
) joinedlist
JOIN (SELECT @rownum:=1) rn
) calclist
WHERE calclist.count <= 3
;
它可以应付任何数量的房间中的用户,无论是否有室友;任何数量的其他用户不共享任何房间;它可以应对“乱序”输入的数据。关于SQL Fiddler的工作示例;如果使用动态参数进行计数,请归功于Jimmy's Blog。
答案 1 :(得分:0)
SELECT a.*
FROM rooms a
WHERE
(
SELECT COUNT(*)
FROM rooms b
WHERE a.room = b.room AND
a.user >= b.user
) <= 3
ORDER BY a.Room, a.User