在MySQL中使用sum时出现错误的结果

在MySQL中使用sum时出现错误的结果,mysql,sum,Mysql,Sum,我有一个拥有大量数据的视图。我可以使用ok和优化的子查询数据获得此结果: +------------+ | attendance | +------------+ | 319 | | 102 | | 598 | | 113 | | 6 | | 279 | | 366 | | 146 | | 669 | | 205 | | 123 | +--

我有一个拥有大量数据的视图。我可以使用ok和优化的子查询数据获得此结果:

+------------+
| attendance |
+------------+
|        319 |
|        102 |
|        598 |
|        113 |
|          6 |
|        279 |
|        366 |
|        146 |
|        669 |
|        205 |
|        123 |
+------------+
下次某些用户更新数据时,会显示以下内容:

+------------+
| attendance |
+------------+
|        319 |
|        102 |
|        598 |
|        113 |
|          7 |
|        279 |
|        253 |
|        146 |
|        669 |
|        561 |
|        123 |
+------------+
这是可以的,因为更新信息的用户是之前有6个作为出勤的用户

但是,当我将这些数据作为一种诱惑时,问题就来了,然后我做出:

 SELECT SUM(attendance) AS total FROM ( /* Subquery returning the above table */)
因为它首先返回,一个用户有6个出席:

+-------+
| total |
+-------+
|  3169 |
+-------+
和7:

+-------+
| total |
+-------+
|  3128 |
+-------+
什么时候应该是3170

想法

编辑1:粘贴完整查询

SELECT SUM(att_member) AS total
FROM
    (SELECT attendance AS att_member
     FROM
         (SELECT id_branch_channel, id_member, attendance, TIMESTAMP, id_event
          FROM view_event_attendance
          WHERE id_event = 782
          ORDER BY TIMESTAMP DESC) AS temptable
     GROUP BY 
              id_member) AS total_attendance_temp
编辑2:粘贴我从这里获得的查询帮助


这是视图的模式。

让我们来取消查询,好吗

我假设view_event_出席人数对每个参加活动的与会者成员都有一个记录。id_事件是该事件的FK,id_成员是与会者的FK。您的内部选择将为您提供一个有序的列表,其中列出了参加活动782的所有成员

SELECT id_branch_channel, id_member, attendance, TIMESTAMP, id_event
FROM view_event_attendance
WHERE id_event = 782
ORDER BY TIMESTAMP DESC
到目前为止,一切都很顺利。现在将此查询包装到另一个查询中:

SELECT attendance AS att_member
FROM (subquery)
GROUP BY id_member
在大多数SQL Dialetc中,这只是一个语法错误。MySQL允许这样做,但结果可能不是您想要的。您将获得参加上述活动的每位id_会员的出席情况栏。你实际上可能期望的是出席人数的总和,但我相信你在问题中没有这样说。在任何情况下,每个选定字段都应该位于GROUPBY子句中,或者使用聚合函数,例如

SELECT SUM(attendance) AS att_member
FROM (subquery)
GROUP BY id_member

话虽如此,我认为没有必要首先使用子查询。假设您希望获得上述总和,可以将其重新转换为单个SQL查询:

SELECT SUM(attendance) AS att_member
FROM view_event_attendance
WHERE id_event = 782
GROUP BY id_member
如果您想要总计,您可以简单地将GROUP BY子句省略,留下以下内容:

SELECT SUM(attendance) AS att_member
FROM view_event_attendance
WHERE id_event = 782

如果这不符合预期,请更详细地描述您在view\u event\u Attention中实际存储的内容,以及您希望第二个查询计算的内容。

正如@EdGibbs所注意到的,子查询返回了我没有注意到的糟糕结果。因此,我再次阅读了我的代码,通过这样做,事情现在可以正常工作了:

SELECT SUM(att_member) AS total
FROM
    (SELECT attendance AS att_member
     FROM
         (SELECT 
            id_branch_channel, 
            id_member, 
            substring(max(concat(from_unixtime(timestamp),attendance)) from 20) as attendance, 
            timestamp, 
            id_event
          FROM view_event_attendance
          WHERE id_event = 782
          GROUP BY id_event, id_member
          ORDER BY timestamp DESC) AS temptable
     ) AS total_attendance_temp
我所做的唯一改变是:

使用:substringmaxconcatfrom_unixtimetimestamp,从20开始的考勤作为考勤,而不是仅作为考勤。 在第一个子查询中移动组。 所以问题不在MySQL的SUM函数中,而是在我的查询中


谢谢大家花时间帮我做这件事。您的建议帮助我得到答案。

要么是MySQL错误,要么是子查询有问题。我在子查询上下赌注:你能发布它吗?除非查询非常大/难看,你能在这里显示它们吗?还要注意,你发布的值列表的差异超出了第5行的6和7。第7行在第一个列表中有366个,第二个列表中有253个,第10行在第一个列表中有205个,第二个列表中有561个。@EdGibbs Yeap,你说得对。我没注意到。然后我会搜索子查询…@AbrahamSustaita-谢谢你的链接;现在我明白你为什么需要子查询了:顺便说一句,在这个问题上做得很好!谢谢你的帮助!但是我想如果你能理解为什么我需要子查询。然而,我发现了我的错误。再次阅读那个链接,我记得我从来没有使用过答案,所以这样做可以修复它。有什么评论吗?看看我在这里给出的答案。再次感谢你:我现在明白你实际上是在依赖非标准行为。我知道你为什么要这么做,但现在看来聪明的解决方案可能是事后看来最糟糕的事情。那么你的建议是什么呢?让我解释一下我在做什么。我需要有参加活动的记录。因此,我有一个只包含该信息的表:id_member_event这是一个fk,指向一个包含事件成员关系、出席率、时间戳等信息的表。因此,在该表中,我可以多次参加某个活动,比如说,一个用户在一个大型活动中发送多个事件在我的视图中,我有整个活动的信息:id\u活动、id\u成员、id\u成员、id\u分支机构、id\u成员活动、id\u事件、是否在线、出席,时间戳我想这一切都取决于你的内部视图实际做了什么,以及是否有办法使用聚合函数(例如MAX)来检索最新的出席人数。如果没有办法进一步优化它,您可能需要考虑对日志进行反编译,以便父记录获取Lestest-KayCurn列。看看两个子查询和对非标准行为的依赖,想象您的视图也很重要,我怀疑您的解决方案是一个难以理解的问题,b难以完整记录,c在基础表变大时可能会影响性能。@Hazzit您能给我一个示例,说明如何将该查询重新编码为使用MAX吗?
SELECT SUM(att_member) AS total
FROM
    (SELECT attendance AS att_member
     FROM
         (SELECT 
            id_branch_channel, 
            id_member, 
            substring(max(concat(from_unixtime(timestamp),attendance)) from 20) as attendance, 
            timestamp, 
            id_event
          FROM view_event_attendance
          WHERE id_event = 782
          GROUP BY id_event, id_member
          ORDER BY timestamp DESC) AS temptable
     ) AS total_attendance_temp