mysql - 当 COUNT 返回 null 时如何插入零? MySQL

标签 mysql count null

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

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;

下面是最终对我有用的查询。感谢戈登对此提供的重要帮助。

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 的行。以下代码执行此操作,但不在 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;

关于mysql - 当 COUNT 返回 null 时如何插入零? MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18709741/

相关文章:

Mysql Distinct Join 记录不匹配或根本没有连接数据

mysql - 错误 : Failed to build gem native extension - Error installing mysql2

r - 如何找到列表中的运行次数?

mysql - 对列进行计数并内连接另一个表时出错

c - 如何使用英特尔 C 编译器为双函数返回 NULL?

c++ mysql在数据库中插入

mysql - 从以逗号分隔的电子邮件列表中查找特定电子邮件 电子邮件列表存储在一个表字段中

mysql - 统计MYSQL中的查询结果

xcode - NSURL 请求中的双引号

java - Eclipse 中的空注释处理器