2012-03-15 139 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