2012-03-16 15 views
0

我不是在使用複雜的MySQL的非常好,所以我堅持帶着幾分複雜的(但仍然非常基本的,我認爲)情況:排序(算上本FK記錄)

我有3個表:

  • 表A有2個記錄,一個與ID 1,一種具有ID 2他們都有一個 外鍵表B,這是相同的。
  • 表B目前只有 一條記錄,但將來會有更多。
  • 表C有多個 記錄,所有與表A的參考要麼記錄1或2

我想達到的目標: 我想選擇所有(或部分)關於表A的信息記錄,但僅限於引用表B中記錄的那些記錄。現在,對我來說,這就是我的結果:我想要命令結果,從表C中記錄最多的記錄開始。

所以:

SELECT COUNT(C.*) AS NUMBER_OF_RECORDS, A.* 
    FROM `TableA` A, `TableB` B, `TableC` C 
    WHERE A.bID = 1 AND C.aID = A.ID 
    ORDER BY NUMBER_OF_RECORDS DESC; 

類似的東西,不同的是,這並不爲C.aID = A.ID工作。我希望上面的問題能讓我的意圖更清楚。

任何幫助非常感謝!樣本數據

表的情況

更好的視野:

  1. 位置
  2. 員工

所以現在說,我希望選擇所有部門在一個地點的數據,訂單由員工數量決定。

希望的輸出:


DepartmentID的,DEPARTMENTNAME,no_of_emps
1,銷售,14
2,金融,12
3,管理,6

+2

您需要一個分組語句,因爲您具有聚合函數COUNT。 – kirilloid 2012-03-16 15:02:22

+0

發佈一些樣本數據n所需的o/p ...而不是在長段落中解釋你的問題,如果你發佈樣本數據,每個人都可以輕鬆理解和幫助你... – Teja 2012-03-16 15:03:07

+0

這將會有點複雜,我的MySQL技能是沒有達到挑戰(沒有測試平臺)。我想你需要使用一個子查詢,其中'TableA'是INNER JOIN到'TableB',OUTER JOINed是'TableC' - 你需要通過'TableA.ID'上的GROUP BY。希望能給你一些指導。 – 2012-03-16 15:05:10

回答

1
SELECT 
     COUNT(C.aID) AS NUMBER_OF_RECORDS 
    , A.* 
    FROM 
     `TableA` A 
    JOIN 
     `TableB` B 
     ON B.ID = A.bID 
    LEFT JOIN      --- so you also get rows from A (and B) 
     `TableC` C     --- that have no matching rows in C 
     ON C.aID = A.ID 
GROUP BY 
    A.ID 
ORDER BY 
    NUMBER_OF_RECORDS DESC; 
+0

這不會起作用,因爲除了它們是聚合的一部分之外,您的選擇中的項目不在您的組中,除非它們是聚合的一部分 – 2012-03-16 15:29:18

+0

恰恰是我需要的,只需進行一些編輯(例如,不需要COUNT(C 。*),使得COUNT(C.name):)。太感謝了! – 2012-03-16 15:40:22

+0

@ Mark:是的,更正了。 – 2012-03-16 15:44:22

0

這應該給你想要的東西:

SELECT A.departmentId, A.departmentName, COALESCE(no_of_emps,0) no_of_emps 
FROM Department A 
INNER JOIN Location B 
ON A.LocationId = B.LocationId 
LEFT JOIN (SELECT departmentId, COUNT(*) no_of_emps 
      FROM Employee 
      GROUP BY departmentId) C 
ON A.departmentId = C.departmentId 
WHERE A.LocationId = 123 
ORDER BY COALESCE(no_of_emps,0) DESC 
-1

你想通過引用C的元組的數量得到A的所有元組?

SELECT A.* FROM A, 
(SELECT COUNT(*) cnt FROM C WHERE C.aid = A.ID) CNT 
ORDER BY CNT.cnt 
+0

您忘記了B表的領帶,並在最終選擇中包含cnt。此外,訂單是DESC – 2012-03-16 15:30:44

0

這應該工作:

SELECT `D`.`departmentId`, `D`.`departmentName`, COUNT(`E`.`employeeId`) AS `no_of_emps` 
FROM `Department` `D` 
INNER JOIN `Location` `L` ON `D`.`departmentId` = `L`.`departmentId` 
INNER JOIN `Employee` `E` ON `D`.`departmentId` = `E`.`departmentId` 
WHERE `L`.`locationId` = 1 
ORDER BY `no_of_emps` DESC; 

請更換表和列名,按您的架構。

希望它有幫助。