2011-09-06 43 views
1

我需要一个SQL语句,需求是:有一个表,它有两列:ID,Owner_ID;我插入几条记录,例如:在sql中使用count

ID Owner_ID 
0   0 
1   0 
2   1 
3   1 
4   2 
5   3 
6   3 
7   3 
8   3 
9   0 

现在我需要一个SQL语句,返回由不同的用户拥有,从最大到最小的行数排序的ID列表。在这个例子中,拥有者3有四行;所有者0有三行,所有者1有两行;和所有者2有一行。结果应该是

ID Owner_ID 
5   3 
6   3 
7   3 
8   3 
0   0 
1   0 
9   0 
2   1 
3   1 
4   2 

我想我应该使用聚合函数计数,有没有人有想法?

我正在使用HSQLDB。

在此先感谢!

+2

哪个DBMS?如图所示以纯SQL生成结果需要一个DBMS,该DBMS允许您对选择列表中不存在的(计算)列进行ORDER BY,这不是标准的SQL功能。 –

回答

4

这将适用于大多数SQL DBMS,但显示计数值。

SELECT ID, Owner_ID, Owner_Count 
    FROM AnonymousTable AS A 
    JOIN (SELECT Owner_ID, COUNT(*) AS Owner_Count 
      FROM AnonymousTable 
     GROUP BY Owner_ID 
     ) AS B ON B.Owner_ID = A.Owner_ID 
ORDER BY Owner_Count DESC, Owner_ID ASC, ID ASC; 

这将适用于一些但不一定是全部DBMS;它通过未在结果列表中显示的列进行排序:

SELECT ID, Owner_ID 
    FROM AnonymousTable AS A 
    JOIN (SELECT Owner_ID, COUNT(*) AS Owner_Count 
      FROM AnonymousTable 
     GROUP BY Owner_ID 
     ) AS B ON B.Owner_ID = A.Owner_ID 
ORDER BY Owner_Count DESC, Owner_ID ASC, ID ASC; 
4

这非常直截了当。

SELECT 
    ID, 
    Owner_ID 
FROM 
    TheTable t 
ORDER BY 
    (SELECT COUNT(*) FROM TheTable i WHERE i.Owner_ID = t.Owner_ID) DESC 
+0

或者“ORDER BY(SELECT COUNT(*)FROM TheTable i WHERE i.Owner_ID = t.Owner_ID)DESC,Owner_ID,ID”? – Andy

+0

@安迪:如果你想。 OP没有指定任何组内分类,但应该很容易弄清楚。 :) – Tomalak

3

是的,你有一般的想法。请尝试以下查询:

select t.ID, t.Owner_ID 
from table t 
inner join (select Owner_ID, count(*) c from table t group by Owner_ID) tc 
    on t.Owner_ID = tc.Owner_ID 
order by 
    tc.c desc, t.ID asc