【问题标题】:SQL Join returns only one recordSQL Join 只返回一条记录
【发布时间】:2012-03-15 14:14:36
【问题描述】:

我正在编写一个查询,试图计算报告和分配表中的记录总数,同时从主表组中检索信息。组有一个主键 id,它作为 gid 保存在其他表中。这是查询:

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`;

我的问题是,每当我执行此操作时,即使他们有多个组,也只会返回一条记录。

提前致谢。

【问题讨论】:

  • 哪个 RDBMS?这甚至不会在 SQL Server 中解析。
  • 不会投反对票,但我想给一个-5 来命名一个表“组”。至少在它周围使用括号......请。
  • 它是 mysql 不是因为有人刚刚编辑它
  • 我没有这样做,只是有人改变了它
  • 你的回车/换行键坏了吗?

标签: mysql database join count


【解决方案1】:

好吧,您的查询远非正确 :) 首先,您不应该有没有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;

我希望我能准确理解您在寻找什么,但这可能会让您了解如何获得您期望的结果。

【讨论】:

  • 我试图获取一组提交的报告总数以及管理员分配的任务总数。积极的意思是小组是否仍在一起工作
【解决方案2】:

在您的查询中看不到任何会限制它返回一条记录的明显内容。

您将不得不将其分解以查看问题出在您现有数据的哪里。

那么有多少组的活跃度 = 0,有多少组有对应的分配记录,等等。

【讨论】:

    【解决方案3】:

    也许会有所帮助:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2016-05-22
      • 2018-09-13
      • 1970-01-01
      相关资源
      最近更新 更多