2014-02-19 3 views
0

두 개의 다른 쿼리에서 만든 쿼리의 결과가 동일한 결과를 반환하지 않습니다.조합 된 쿼리가 다른 결과를 반환합니다.

를 쿼리

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로를 결합했다 나의 논리가 쿼리 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는 A 또는 B에서 찾을 수없는 잘못된 레코드를 추가하고 두 경우에 항목을 복제합니다.

나는 2를 결합하는 것에 대한 나의 논리가 어긋나는 곳에서 몇 가지 조언을 원합니다.

이 게시물에서 쉼표가 수정되었으므로 실제 쿼리에 포함되었습니다.

내 일정은 코스에 등록되었지만 일정 기간 내에 시스템에 로그인하지 않았고 코스에 액세스하고 코스에서 활동을 완료하지 않은 모든 사용자를 나열하는 것입니다.

그래서 내가 찾고 있어요 논리는 다음과 같습니다 사용자가 60 일 이내에 로그인하지 않은 경우 - 표시 이름 에 기록하지만, 60 일 이내에 과정에 액세스하지 않은 경우 - 표시 이름 을 로그인 한 경우 및 액세스 한 과정은 완료했지만 과정 활동을 완료하지 않음 - 표시 이름

검색어 A는 활동을 시작했지만 60 일 이내에 완료되지 않은 모든 사용자를 나열합니다. 검색어 B는 로그인하지 않았거나 코스에 액세스 한 모든 사용자를 나열합니다 60 일

모든 3 조건을 만족시키기 위해 2 개의 쿼리를 결합하려고 시도하는 중 이온은 내가 문제가있는 곳입니다. 처음에는 UNION을 시도했지만 작동시키지 못했습니다.

+0

쿼리 A의 두 번째 줄과 쿼리 B의 여섯 번째 줄에 쉼표가 누락되었습니다. – Rachcha

+0

@ Rachcha - 누락 된 쉼표를 지적 해 주셔서 감사합니다. 나는 실제적인 질문이 맞았지만 그 글을 바로 잡았다. –

답변

0

두 검색어에서 동일한 세계에서 선택하지 않습니다. 쿼리 A에는 선택할 테이블이 6 개 있으며 쿼리 B에는 5 (해당 mdl_scorm 테이블이 없음)가 있고 쿼리 C에는 쿼리 B에있는 5 개의 테이블이 있습니다. 이제 쿼리 A의 범위가 변경되었습니다. 이 추가 테이블은 조인에서 이제 C의 선택 항목에 대해 쿼리 C에 나타나는 행을 제거 할 수있었습니다.

쿼리에서 누락 된 mdl_scorm 테이블로 쿼리 A를 확인하면 결과 크기가 다를 수 있습니다. 테이블의 경우 필터의

열 선택으로 그것의

생각해; 열 및 필터 결합 (선택 항목 및 제한 결과 펼치기)

+0

표가 누락되었습니다. 질의 A는 개인이 코스에 등록 된시기를 기준으로 주어진 시간 내에 완료되지 않았는지 확인합니다. 쿼리 B는 등록 된 사용자가 시스템에 로그인했거나 코스에 액세스했는지 여부를 확인합니다. –

관련 문제