【问题标题】:How to insert a zero when COUNT returns null? MySQLCOUNT返回null时如何插入零? MySQL
【发布时间】:2013-09-10 02:13:58
【问题描述】:

我在触发器中有以下内容,并希望它在返回 NULL 时插入零。在过去的两天里,我在 Stackoverflow 和其他网站上阅读了各种帖子,但一直无法实现我想要的……并且恐怕这不可能……?此查询返回 MCVMoodle.mdl_facetoface_signups.userid 中的所有用户,其计数值为等级(满足 WHERE 条件),计数值为 1 或更多,但没有 0/null。我理解在没有结果/null 的情况下工作的困难,但是当计数为 0/null 时是否有插入零?

INSERT INTO MCVMoodle.mdl_user_info_data_f2fskipcount (userid, fieldid, datab)

SELECT MCVMoodle.mdl_facetoface_signups.userid as 'userid', 4 as 'fieldid',
      COUNT(MCVMoodle.mdl_facetoface_signups_status.grade) as 'datab'
        FROM
            MCVMoodle.mdl_facetoface_signups
        LEFT JOIN
            MCVMoodle.mdl_facetoface_signups_status on MCVMoodle.mdl_facetoface_signups.id = MCVMoodle.mdl_facetoface_signups_status.signupid
       WHERE
    MCVMoodle.mdl_facetoface_signups_status.statuscode = 80
      AND  MCVMoodle.mdl_facetoface_signups_status.superceded = 0
      AND  MCVMoodle.mdl_facetoface_signups_status.grade = 0
       GROUP BY
        MCVMoodle.mdl_facetoface_signups.userid;

以下是最终对我有用的查询。感谢 Gordon 在这方面提供的重要帮助。

INSERT INTO MCVMoodle.mdl_user_info_data_f2fskipcount (userid, fieldid, datab)

SELECT MCVMoodle.mdl_facetoface_signups.userid as 'userid', 4 as 'fieldid',
             COUNT(MCVMoodle.mdl_facetoface_signups_status.grade) as 'datab'
      FROM MCVMoodle.mdl_facetoface_signups LEFT JOIN
           MCVMoodle.mdl_facetoface_signups_status
           on MCVMoodle.mdl_facetoface_signups.id = MCVMoodle.mdl_facetoface_signups_status.signupid and
              MCVMoodle.mdl_facetoface_signups_status.statuscode = 80 AND
              MCVMoodle.mdl_facetoface_signups_status.superceded = 0 AND
              MCVMoodle.mdl_facetoface_signups_status.grade = 0
      GROUP BY MCVMoodle.mdl_facetoface_signups.userid
      ON DUPLICATE KEY UPDATE
       datab=VALUES(datab);

【问题讨论】:

  • 或许不是。如果您的计数返回 NULL,请检查链接的问题。如果根本没有返回任何行,那就是别的东西(可能需要将条件从 WHERE 移动到 ON)。你的问题在这一点上有点含糊。
  • Thilo,谢谢,实际上我确实阅读了您链接的帖子并尝试了那里列出的各种建议,但无法让它们中的任何一个起作用。抱歉我的评论含糊不清……这很可能是因为我缺乏知识。我想当没有行存在时我想要的是零……如果可能的话?我的意思是,当 WHERE 子句中没有符合条件的行时,我会插入 'userid', 4, 0 (这样更有意义吗?)谢谢。

标签: mysql count null


【解决方案1】:

如果我理解正确,您想插入查询中的所有内容。但是如果查询为空,则插入一行所有NULLs。以下是这样做的,但不是在 MySQL 中:

with cte as (
      SELECT MCVMoodle.mdl_facetoface_signups.userid as 'userid', 4 as 'fieldid',
             COUNT(MCVMoodle.mdl_facetoface_signups_status.grade) as 'datab'
      FROM MCVMoodle.mdl_facetoface_signups LEFT JOIN
           MCVMoodle.mdl_facetoface_signups_status
           on MCVMoodle.mdl_facetoface_signups.id = MCVMoodle.mdl_facetoface_signups_status.signupid
      WHERE MCVMoodle.mdl_facetoface_signups_status.statuscode = 80 AND
            MCVMoodle.mdl_facetoface_signups_status.superceded = 0 AND
            MCVMoodle.mdl_facetoface_signups_status.grade = 0
      GROUP BY MCVMoodle.mdl_facetoface_signups.userid
     )
INSERT INTO MCVMoodle.mdl_user_info_data_f2fskipcount (userid, fieldid, datab)
    select *
    from cte
    union all
    select NULL, NULL, NULL
    where not exists (select * from CTE);

MySQL版本比较复杂:

INSERT INTO MCVMoodle.mdl_user_info_data_f2fskipcount (userid, fieldid, datab)
    select *
    from (SELECT MCVMoodle.mdl_facetoface_signups.userid as 'userid', 4 as 'fieldid',
                 COUNT(MCVMoodle.mdl_facetoface_signups_status.grade) as 'datab'
          FROM MCVMoodle.mdl_facetoface_signups LEFT JOIN
               MCVMoodle.mdl_facetoface_signups_status
               on MCVMoodle.mdl_facetoface_signups.id = MCVMoodle.mdl_facetoface_signups_status.signupid
          WHERE MCVMoodle.mdl_facetoface_signups_status.statuscode = 80 AND
                MCVMoodle.mdl_facetoface_signups_status.superceded = 0 AND
                MCVMoodle.mdl_facetoface_signups_status.grade = 0
          GROUP BY MCVMoodle.mdl_facetoface_signups.userid
         ) cte
    union all
    select NULL, NULL, NULL
    where not exists (SELECT MCVMoodle.mdl_facetoface_signups.userid as 'userid', 4 as 'fieldid',
                             COUNT(MCVMoodle.mdl_facetoface_signups_status.grade) as 'datab'
                      FROM MCVMoodle.mdl_facetoface_signups LEFT JOIN
                           MCVMoodle.mdl_facetoface_signups_status
                           on MCVMoodle.mdl_facetoface_signups.id = MCVMoodle.mdl_facetoface_signups_status.signupid
                      WHERE MCVMoodle.mdl_facetoface_signups_status.statuscode = 80 AND
                            MCVMoodle.mdl_facetoface_signups_status.superceded = 0 AND
                            MCVMoodle.mdl_facetoface_signups_status.grade = 0
                      GROUP BY MCVMoodle.mdl_facetoface_signups.userid
            );

编辑:

在我看来,您可能只想包含查询中的所有组合,即使是那些被where 子句消除的组合。如果是,则将条件移至on 子句:

with cte as (
      SELECT MCVMoodle.mdl_facetoface_signups.userid as 'userid', 4 as 'fieldid',
             COUNT(MCVMoodle.mdl_facetoface_signups_status.grade) as 'datab'
      FROM MCVMoodle.mdl_facetoface_signups LEFT JOIN
           MCVMoodle.mdl_facetoface_signups_status
           on MCVMoodle.mdl_facetoface_signups.id = MCVMoodle.mdl_facetoface_signups_status.signupid and
              MCVMoodle.mdl_facetoface_signups_status.statuscode = 80 AND
              MCVMoodle.mdl_facetoface_signups_status.superceded = 0 AND
              MCVMoodle.mdl_facetoface_signups_status.grade = 0
      GROUP BY MCVMoodle.mdl_facetoface_signups.userid
     )
INSERT INTO MCVMoodle.mdl_user_info_data_f2fskipcount (userid, fieldid, datab)
    select *
    from cte;

【讨论】:

  • 戈登,谢谢你的帮助。实际上,我想要的是在给定条件的情况下插入'userid'和'fieldid'的4和'datab'的计数。我发布的查询工作正常,除非它没有结果(或 null ......我猜)。从我的应用程序的角度来看,没有结果需要等于零,但鉴于 mysql 的局限性(或者希望只是我的知识),我似乎无法弄清楚当查询最终没有结果时如何插入零一个特定的“用户 ID”。这有意义吗?
  • @JasonHollowell 。 . .当您的子查询不会插入任何行时,第一个版本会插入一行。第二个插入所有用户 ID 的行,即使计数为 0。
  • 戈登,感谢您的帮助。我刚刚尝试过这个并在“with cte”处遇到语法错误......我不确定我做错了什么......?我正在使用 MySQL 5.1.69...不确定这是否重要但是...
  • @JasonHollowell 。 . .哎哟。我错过了这被标记为 MySQL。
  • 戈登,非常感谢您一直以来的支持。我刚刚尝试了您发布的 MySQL 版本。我在第 15 行遇到语法错误(不存在的地方)。而且,顺便说一句,我很好奇 INSERT NULL NULL NULL 行。这会导致三个零吗?我希望实现的是用户 ID(例如 301467),字段 ID 为 4,当计数未返回任何内容时,dabab 为 0....也许这就是您为我提交的查询将实现的,我是只是没有遵循逻辑......
猜你喜欢
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 2014-09-08
  • 1970-01-01
  • 2011-12-19
  • 2012-05-31
  • 2015-11-30
  • 2013-08-06
相关资源
最近更新 更多