按来自另一个 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
我有两个 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