按来自另一个 table 的数据排序数据

Order data by data from another table

我有两个 table:

房间(所有房间)

id | title  | ...
-----------------
1  |Room 1  |
2  |Room 2  |
3  |Room 3  |

user_rooms(其中房间是每个用户,用户列是用户的id,它是主列)

user  | room | ...
------------------
20    | 3    |
14    | 1    |
35    | 3    |

所以我想 select 'rooms' table 中的所有房间,但以这种方式排序以显示其中用户最多的房间,然后是用户越来越少的房间。例如,我想先显示房间 3(因为里面有 2 个用户),然后是房间 1(里面有一个用户),最后是房间 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;
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

这将只为您提供有用户的房间

    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

这通常在没有子查询的情况下完成:

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;

这可能是最有效的方法,因为它删除了外部查询中的聚合。

请尝试以下查询:

select * 来自房间 r 按 (select count(1)
排序 来自你的用户空间 其中 ur.roomid = r.roomid ) desc