Py学习  »  问与答

Group by 如何按分组成员数量排序?

superdjangor • 9 年前 • 4725 次点击  

例如表staff:

name,job
张五,程序员
张三,工程师
李四,工程师
李六,程序员
赵三,经理
张八,程序员

现在希望按职位分组,并且按组员数倒序排列输出每条记录, 即:

张五,程序员
李六,程序员
张八,程序员
张三,工程师
李四,工程师
赵三,经理

我仔细阅读了相关文档,没有找到合适的方法.诸如:

staff.objects.values('job').annotate(Count('job'))

这个是不行的,它并不是逐条按记录输出,而是输出一个字典对象.

直接staff.objects.order_by('job')也是不一定能成功的, 因为它无法保证按组员数倒序排列. 它有可能是这样输出:

张三,工程师
李四,工程师
张五,程序员
李六,程序员
张八,程序员
赵三,经理

有何办法吗? 实在不行用SQL命令也可以, 但我SQL命令也没有找到解决办法.

补充: 希望在数据库层面解决这个问题. 我目前的解法办法是读到内存里面交给python做,但表大了就占内存了.

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/1324
 
4725 次点击  
文章 [ 3 ]  |  最新文章 9 年前
superdjangor
Reply   •   1 楼
superdjangor    9 年前

@MCC 受益匪浅,非常感谢

MCC
Reply   •   2 楼
MCC    9 年前

(mysql) 其他的backend语句可能细节不一样

其实还有曲线救国方法、、先根据count读出job的列表再根据job表格for读name

MCC
Reply   •   3 楼
MCC    9 年前
SELECT * FROM test.job;

id  job
1   开发
2   测试
3   销售

SELECT * FROM test.staff;

id  name    job_id
1   张三      1
2   李四      2
3   王五      3
4   赵六      1
5   钱七      2
6   孙八      3
7   周九      1
8   吴十      2
9   郑零      1

SELECT s1.id, s1.name, s1.job_id, j.job
FROM test.staff s1
JOIN ( SELECT job_id, COUNT(*) AS cnt
       FROM test.staff
       GROUP BY job_id
     ) s2 ON ( s2.job_id = s1.job_id )
JOIN test.job j on(j.id = s1.job_id)
ORDER BY s2.cnt DESC ,s1.id;

id  name    job_id  job
1   张三      1       开发
4   赵六      1       开发
7   周九      1       开发
9   郑零      1       开发
2   李四      2       测试
5   钱七      2       测试
8   吴十      2       测试
3   王五      3       销售
6   孙八      3       销售