2011-11-29 80 views
3

我有兩個表CompaniesContact與一對多關係,我想 選擇公司名稱和聯繫計數和下一個命令由他們,但它沒有工作。用連接數和許多列排序

SELECT comp.Name , count(cc.Id) CCount 
FROM Contacts cc JOIN Companies comp ON comp.Id = cc.Company_id 
GROUP BY comp.Name 
ORDER BY CCount desc, comp.Name desc 

現在我得到的結果通過接觸數排序,但叫不上名字

SELECT comp.Name , count(cc.Id) CCount 
FROM Contacts cc JOIN Companies comp ON comp.Id = cc.Company_id 
GROUP BY comp.Name 
ORDER BY comp.Name desc, CCount desc 

現在我獲得按名稱排序的結果,但不計

+0

你能告訴我們一些實際的結果,而你反而期待什麼? – AakashM

+0

順序通過很好。這個問題似乎很奇怪 –

+0

[t-clausen.dk]它是你有權利的問題,問題是奇怪;) – GregJaw

回答

4

總是發佈DDL和INSERT語句。這是我期望的。

create table companies (
    id integer primary key, 
    name varchar(10) 
); 

create table contacts (
    id integer primary key, 
    company_id integer references companies (id) 
); 

insert into companies values (1, 'First'); 
insert into companies values (2, 'Second'); 
insert into companies values (3, 'Third'); 

-- Companies 'First' and 'Third' both have 3 contacts. 
insert into contacts values (100,1); 
insert into contacts values (101,1); 
insert into contacts values (102,1); 
insert into contacts values (201,2); 
insert into contacts values (301,3); 
insert into contacts values (302,3); 
insert into contacts values (303,3); 

您的第一個查詢。

SELECT comp.Name , count(cc.Id) CCount 
FROM Contacts cc JOIN Companies comp ON comp.Id = cc.Company_id 
GROUP BY comp.Name 
ORDER BY CCount desc, comp.Name desc 

name ccount 
-- 
Third 3 
First 3 
Second 1 

ORDER BY CCount desc將會把較大的數字在頂部。在每組相同的計數中,名稱將按降序排列。 「Second」在最後一行,因爲它的計數爲1.

您的第二個查詢。

SELECT comp.Name , count(cc.Id) CCount 
FROM Contacts cc JOIN Companies comp ON comp.Id = cc.Company_id 
GROUP BY comp.Name 
ORDER BY comp.Name desc, CCount desc 

name ccount 
-- 
Third 3 
Second 1 
First 3 

ORDER BY comp.Name desc將按公司名稱降序排列。在每組相同的公司名稱中,ccounts將按降序排列。由於不能有任何相同公司名稱的組(爲什麼?),對ccount的排序沒有任何影響。

+0

非常感謝解釋,我正在用我的心靈在奇怪的driaction。 – GregJaw

2

在SQL ORDER BY子句可以排序在多列上,它們按字段順序排列,即先按第一個字段進行排序,然後再按字段值重複排序第二個字段。


ORDER BY名稱DESC,計數DESC

Smith 9 
Smith 5 
Smith 2 
Jones 9 
Doe  9 

的前三行有一個重複的名稱,以便它們被計數


ORDER BY計數DESC,名稱DESC

排序
Smith 9 
Jones 9 
Doe  9 
Smith 5 
Smith 2 

該fi前三個行有一個重複計數,以便它們按名稱排序


如果這些都不是你想要的,編輯您的問題加在你正在尋找的順序記錄的樣本名單。