-1

目前,我正在使用以下 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
4

2 回答 2

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如何使用动态参数进行计数。

于 2013-04-17T16:31:18.883 回答
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
于 2013-04-17T06:03:12.750 回答