我有两张桌子:
房间(所有房间)
id | title | ...
-----------------
1 |Room 1 |
2 |Room 2 |
3 |Room 3 |
user_rooms(每个用户都是空间,列用户是用户的ID及其主要列)
user | room | ...
------------------
20 | 3 |
14 | 1 |
35 | 3 |
所以我想选择“房间”中的所有房间。表,但以这种方式订购它们以显示其中包含最多用户的房间,之后用户用户越来越少。例如,我想首先显示房间3(因为其中有2个用户),然后是房间1(其中一个用户),最后是房间2(因为没有用户在其中)。如何实现?
答案 0 :(得分:2)
SELECT aa.id, aa.title
FROM rooms AS aa
LEFT JOIN (
SELECT room, COUNT(*) AS total_count
FROM user_rooms
GROUP BY room
) AS _aa
ON aa.id = _aa.room
ORDER BY _aa.total_count;
答案 1 :(得分:2)
这通常是在没有子查询的情况下完成的:
select r.id, r.title, count(ur.room) as numusers
from rooms r left join
user_rooms ur
on r.id = ur.room
group by r.id, r.title
order by numusers desc;
这通常比使用from
子句中的子查询的版本更有效,因为它可以利用连接键上的索引。
有趣的是,相同的索引将用于select
中的相关子查询,这是另一种方法:
select r.id, r.title,
(select count(*)
from user_rooms ur
where r.id = ur.room
) as numusers
from rooms r
order by numusers desc;
这可能是最有效的方法,因为它会删除外部查询中的聚合。
答案 2 :(得分:1)
select r.id, r.title, coalesce(t.cnt,0)
from rooms r left join
(select room, count(*) as cnt
from user_rooms
group by room) t on t.room = r.id
order by t.cnt desc
答案 3 :(得分:0)
这将只为您提供有用户的房间
SELECT title, count(user) As MostUsers
FROM Rooms R
INNER JOIN user_rooms U
ON R.?field? = U.?field?
GROUP BY title
ORDER BY MostUsers
您需要填写插入可用于加入表格的字段名称的查询
如果您想要所有房间,可以使用左连接:
SELECT title, count(user) As MostUsers
FROM Rooms R
LEFT JOIN user_rooms U
ON R.?field? = U.?field?
GROUP BY title
ORDER BY MostUsers
答案 4 :(得分:0)
请尝试以下查询:
从房间r中选择*
订购方式(选择计数(1)
来自用户室你的
其中ur.roomid = r.roomid)desc