按照另一个表中的数据排序数据

时间:2015-11-18 13:43:11

标签: mysql sql sql-order-by

我有两张桌子:

房间(所有房间)

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(因为没有用户在其中)。如何实现?

5 个答案:

答案 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