2014-01-06 68 views
0

在以下查詢中,我試圖從表中獲取數據:company,classes_by_companyperson。我在名稱爲company_id的所有表中都有一個外鍵。在classes_by_company表中,類可以有class_status,可以是activeinactive。表person及其相應的person_status也是如此。我可以統計班級總人數和總人數,在此查找工作查詢:SQFIDDLE。在下面的查詢中,我試圖合併之前的查詢,但現在也計算總數爲class_status=ACTIVEperson_status=ACTIVE。我收到錯誤Not unique table/alias: 'c'。我怎樣才能算出總人數和活躍班級和人員的總數? SQLFIDDLE在同一表中使用兩個不同值的計數

SELECT a.id, a.company_id, a.status, c.class_status, p.person_status, 
     c.total_count AS classes_per_company, 
     p.total_count AS employees_per_company, 
     c.active_count AS active_classes, 
     p.active_count AS active_instructors 
FROM company a 
LEFT JOIN (SELECT company_id, COUNT(*) as total_count 
      FROM classes_by_company 
      GROUP BY company_id) c 
     ON a.company_id = c.company_id 
LEFT JOIN (SELECT company_id, COUNT(*) as active_count 
      FROM classes_by_company 
      WHERE class_status = 'ACTIVE' 
      GROUP BY company_id) c 
     ON a.company_id = c.company_id 
LEFT JOIN (SELECT company_id, COUNT(*) as total_count 
      FROM person 
      GROUP BY company_id) p 
     ON a.company_id = p.company_id 
LEFT JOIN (SELECT company_id, COUNT(*) as active_count 
      FROM person 
      WHERE person_status = 'ACTIVE' 
      GROUP BY company_id) p 
     ON a.company_id = c.company_id 

表結構:

CREATE TABLE company 
    (
    id int auto_increment primary key, 
    company_id int, 
    status varchar(20) 
    ); 
CREATE TABLE classes_by_company 
(
id int auto_increment primary key, 
company_id int, 
class_name varchar(20), 
class_status varchar(20) 
); 
CREATE TABLE person 
(
id int auto_increment primary key, 
employee_id int, 
company_id int, 
person_name varchar(20), 
person_status varchar(20) 
); 
+0

不能使用相同的別名爲兩個子查詢。做一個子查詢cactive和另一個ctotal ...你也必須對p做同樣的事情。 – Twelfth

+0

接下來,您將遇到引用初始SELECT子句中不存在於您的聯合子查詢中的字段(即c.class_status,p.person_status)的問題。 – Zec

回答

1

您所查詢的結構是好的,你只需要爲您加入的每個子查詢提供不同的別名。

您還未能從c和子查詢中返回class_statusperson_status

SELECT a.id, a.company_id, a.status, c.class_status, p.person_status, 
     c.total_count AS classes_per_company, 
     p.total_count AS employees_per_company, 
     ca.active_count AS active_classes, 
     pa.active_count AS active_instructors 
FROM company a 
LEFT JOIN (SELECT company_id, class_status, COUNT(*) as total_count 
      FROM classes_by_company 
      GROUP BY company_id) c 
     ON a.company_id = c.company_id 
LEFT JOIN (SELECT company_id, COUNT(*) as active_count 
      FROM classes_by_company 
      WHERE class_status = 'ACTIVE' 
      GROUP BY company_id) ca 
     ON a.company_id = ca.company_id 
LEFT JOIN (SELECT company_id, person_status, COUNT(*) as total_count 
      FROM person 
      GROUP BY company_id) p 
     ON a.company_id = p.company_id 
LEFT JOIN (SELECT company_id, COUNT(*) as active_count 
      FROM person 
      WHERE person_status = 'ACTIVE' 
      GROUP BY company_id) pa 
     ON a.company_id = pa.company_id 

我更改了活動類別的ca,活動人員的pa。

SQLFIDDLE

您也可以減少一些用在同一個查詢的總行數着活躍的行加入:

SELECT a.id, a.company_id, a.status, c.class_status, p.person_status, 
     c.total_count AS classes_per_company, 
     p.total_count AS employees_per_company, 
     c.active_count AS active_classes, 
     p.active_count AS active_instructors 
FROM company a 
LEFT JOIN (SELECT company_id, class_status, COUNT(*) as total_count, SUM(class_status = 'ACTIVE') as active_count 
      FROM classes_by_company 
      GROUP BY company_id) c 
     ON a.company_id = c.company_id 
LEFT JOIN (SELECT company_id, person_status, COUNT(*) as total_count, SUM(person_status = 'ACTIVE') as active_count 
      FROM person 
      GROUP BY company_id) p 
     ON a.company_id = p.company_id 

SQLFIDDLE

+0

哦,但是現在我知道了別名,但沒有這樣做。謝謝。關於'id'作爲自動增量的輸入是什麼? 「數字順序」是否有必要? – techAddict82

+0

如果您有一些其他行的唯一標識符,則自動遞增ID不是必需的。但是,您應該研究數據庫規範化以瞭解它們爲何受歡迎的原因。 – Barmar

1

非常小的變化...表別名(或子查詢)不能同

SELECT a.id, a.company_id, a.status, c.class_status, p.person_status, 
    c.total_count AS classes_per_company, 
    p.total_count AS employees_per_company, 
    ca.active_count AS active_classes, 
    pa.active_count AS active_instructors 
FROM company a 
LEFT JOIN (SELECT company_id, COUNT(*) as total_count 
     FROM classes_by_company 
     GROUP BY company_id) c 
    ON a.company_id = c.company_id 
LEFT JOIN (SELECT company_id, COUNT(*) as active_count 
     FROM classes_by_company 
     WHERE class_status = 'ACTIVE' 
     GROUP BY company_id) ca 
    ON a.company_id = c.company_id 
LEFT JOIN (SELECT company_id, COUNT(*) as total_count 
     FROM person 
     GROUP BY company_id) p 
    ON a.company_id = p.company_id 
LEFT JOIN (SELECT company_id, COUNT(*) as active_count 
     FROM person 
     WHERE person_status = 'ACTIVE' 
     GROUP BY company_id) pa 
    ON a.company_id = c.company_id 
相關問題