我在触发器中有以下内容,并希望它在返回 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/