Mysql 组合查询返回不同的结果

Mysql 组合查询返回不同的结果,mysql,sql,select,Mysql,Sql,Select,我从两个不同的查询创建的查询结果返回的结果不相同 询问 SELECT c.fullname Course, u.firstname First, u.lastname Last, u.id ID, u.institution Company FROM (mdl_scorm_scoes_track AS st) JOIN mdl_user AS u ON st.userid=u.id JOIN mdl_scorm AS sc ON sc.id=st.scormid JOIN mdl_cours

我从两个不同的查询创建的查询结果返回的结果不相同

询问

SELECT 
c.fullname Course,
u.firstname First,
u.lastname Last,
u.id ID,
u.institution Company

FROM (mdl_scorm_scoes_track AS st)
JOIN mdl_user AS u ON st.userid=u.id
JOIN mdl_scorm AS sc ON sc.id=st.scormid
JOIN mdl_course AS c ON c.id=sc.course
Join mdl_user_enrolments AS uenr ON uenr.userid=u.id
Join mdl_enrol AS enr ON enr.id=uenr.enrolid 

WHERE (
(st.value='incomplete' OR st.value='not attempted') 
AND DATEDIFF(NOW(), FROM_UNIXTIME(uenr.timecreated)>60)
ORDER BY c.fullname, u.lastname,u.firstname, u.id
问题B

SELECT
c.fullname AS Course,
u.firstname AS Firstname,
u.lastname AS Lastname,
u.id AS ID,
u.institution AS Company,

IF (u.lastaccess = 0,'never',
DATE_FORMAT(FROM_UNIXTIME(u.lastaccess),'%Y-%m-%d')) AS dLastAccess

,(SELECT DATE_FORMAT(FROM_UNIXTIME(timeaccess),'%Y-%m-%d') FROM mdl_user_lastaccess WHERE userid=u.id AND courseid=c.id) AS CourseLastAccess 
FROM mdl_user_enrolments AS ue
JOIN mdl_enrol AS e ON e.id = ue.enrolid
JOIN mdl_course AS c ON c.id = e.courseid
JOIN mdl_user AS u ON u.id = ue.userid
LEFT JOIN mdl_user_lastaccess AS ul ON ul.userid = u.id
WHERE ul.timeaccess IS NULL AND (DATEDIFF(NOW(), FROM_UNIXTIME(ue.timecreated))>60)
ORDER BY u.id, c.fullname
我已将它们组合到查询C中

SELECT
c.fullname AS Course,
u.firstname AS Firstname,
u.lastname AS Lastname,
u.id AS IDNumber,
u.institution AS Institution,

IF (u.lastaccess = 0,'never',
DATE_FORMAT(FROM_UNIXTIME(u.lastaccess),'%Y-%m-%d')) AS dLastAccess

,(SELECT DATE_FORMAT(FROM_UNIXTIME(timeaccess),'%Y-%m-%d') FROM mdl_user_lastaccess WHERE userid=u.id AND courseid=c.id) AS CourseLastAccess


FROM mdl_user_enrolments AS ue
JOIN mdl_enrol AS e ON e.id = ue.enrolid
JOIN mdl_course AS c ON c.id = e.courseid
JOIN mdl_user AS u ON u.id = ue.userid
LEFT JOIN mdl_user_lastaccess AS ul ON ul.userid = u.id
WHERE (ul.timeaccess IS NULL OR ue.userid IN
(SELECT u.id 
FROM (mdl_scorm_scoes_track AS st)
JOIN mdl_scorm AS sc ON sc.id=st.scormid

WHERE c.id=sc.course AND st.userid=u.id AND (st.value='incomplete' OR st.value='not attempted') 
 )
)AND (DATEDIFF(NOW(), FROM_UNIXTIME(ue.timecreated))>60)
ORDER BY c.fullname, u.lastname,u.firstname
在查询C中,我没有找到我的逻辑不正确的地方。查询C添加了A或B都找不到的错误记录,并且在一些情况下重复了条目

我想要一些关于我的逻辑结合2误入歧途的指针

我修正了这篇文章中的逗号,实际的查询中确实有

我的目的是列出所有已注册课程但在给定时间范围内、未登录系统、未访问课程以及最终未完成课程中活动的用户

因此,我要寻找的逻辑是: 如果用户在60天内未登录-显示名称 如果已登录但在60天内未访问课程-显示名称 如果已登录并已访问课程,但尚未完成课程活动-显示名称

查询A确实列出了启动活动但在60天内未完成的所有用户 查询B列出了60天内未登录或访问课程的所有用户


在尝试组合这两个查询以满足所有3个条件时,我遇到了问题。我首先尝试了一个联合,但无法使其工作。

在两个查询中,您的选择不尽相同。查询A有6个表要从中选择,查询B有5个表缺少mdl_scorm表,您的查询C有查询B的5个表。现在,查询A的范围已更改。这个额外的表可能正在删除联接中的行,这些行现在出现在查询C中,用于选择A

我会在查询中缺少mdl_scorm表的情况下检查查询A,您可能会得到不同的结果大小

把它想象成


从包含过滤器的表中选择列;两个查询的数据表范围必须相同,以便您仅连接列和筛选器扩展选择并限制结果

您在查询A的第二行和查询B的第六行中漏掉了逗号。@Rachcha-感谢您指出漏掉的逗号。我已经更正了帖子,但是实际的查询是正确的。丢失的表是故意的。查询A检查课程是否在基于个人注册课程时间的给定时间范围内完成。查询B检查注册用户是否登录过系统或访问过课程。