-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 に答える