2011-09-06 45 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