2012-03-15 137 views
0

我在寫一個查詢,我試圖計算報表和分配表中的記錄總數,whiles同時從主表組中檢索信息。組有一個主鍵ID,它以gid的形式保存在其他表中。這是查詢:SQL Join只返回一條記錄

SELECT `group`.`id` AS `gid` 
     , `group`.`name` AS `g_name` 
     , COUNT(`report`.`id`) AS `reports` 
FROM `group` 
     LEFT OUTER JOIN `report` ON `report`.`gid` = `group`.`id` 
     LEFT OUTER JOIN `assignment` ON `assignment`.`gid` = `group`.`id` 
WHERE `group`.`active` = 0 
ORDER BY 
     `group`.`name`; 

我的問題是每當我執行這個只有一個記錄返回,即使他們的多個組。

在此先感謝。

+0

其中RDBMS?這甚至不會在SQL Server中解析。 – Yuck 2012-03-15 14:19:18

+2

不會倒下,但我想給-5命名一個表「組」。至少在它周圍使用括號......請。 – 2012-03-15 14:21:07

+0

它是mysql,它並不是因爲某人剛剛編輯它 – Parham 2012-03-15 14:21:24

回答

3

那麼,你的查詢是不正確的:)首先,你不應該有沒有group by子句的聚合函數(在這種情況下count)。現在,即使您擁有該子句,查詢也會彙總信息,並且您希望:同一查詢中的詳細信息和摘要。我建議使用2個單獨的查詢來檢索此信息,但是如果希望信息只混合一個查詢(詳細信息以及「報告和分配表中的記錄總數」),請嘗試以下查詢:

SELECT 
    `group`.id AS gid, 
    `group`.name AS g_name, 
    (SELECT COUNT(*) from report) as ReportTotalCount, 
    (SELECT COUNT(*) from assignment) as AssignmentTotalCount, 
FROM `group` 
WHERE `group`.`active` = 0 
LEFT OUTER JOIN report ON report.gid = `group`.id 
LEFT OUTER JOIN assignment ON assignment.gid = `group`.id 
ORDER BY `group`.name; 

我很高興能夠明白你在找什麼,但這可能會給你一個關於如何獲得預期結果的想法。

+0

感謝它的工作!也感謝您的建議 – Parham 2012-03-15 14:29:23

+0

我試圖獲取由一個組提交的報告總數以及管理員分配的總分配數。如果團隊仍在一起工作,積極的方式 – Parham 2012-03-15 14:32:59

0

在您的查詢中看不到任何明顯的內容會限制它返回一條記錄。

您將不得不將其分解以查看問題與現有數據的差異。

那麼有多少組,其中acitive = 0,ahow許多具有相應的分配記錄等

0

也許這將有助於:

SELECT 
    groupid, 
    groupname, 
    reports, 
    assignments, 
FROM 
(SELECT group.id, group.name, COUNT(*) AS reports from group 
    INNER JOIN report ON (report.gid = group.id) 
    WHERE group.active = 0 
    GROUP BY group.id) AS ReportForGroup 
CROSS JOIN 
(SELECT group.id AS groupid, group.name AS groupname, COUNT(*) AS assignments from group 
    INNER JOIN assignmentON (assignment.gid = group.id) 
    WHERE group.active = 0 
    GROUP BY group.id) AS AssignmentForGroup 
    ON (ReportForGroup.groupid = AssignmentForGroup.groupid) 
ORDER BY groupname; 

我無法檢查它,所以如果LEFT JOIN返回COUNT(*)0或1.如果返回0,只需將INNER更改爲LEFT並在兩次查詢之間使用INNER JOIN