2013-03-08 2 views
0

기술자를위한 간단한 출석 시스템이 있습니다. 참석 일수는 tech_logins 테이블에 저장됩니다. 그것은 날짜 당 기술자 당 1 개의 기록을 가지고 있습니다. 기술자가 수행하는 작업은 logs라는 테이블에 저장됩니다. 이 테이블에는 기술자가 완료 한 모든 작업이 들어 있습니다. 또한 tech_logins 테이블과 관련된 두 개의 필드가 있습니다. 이들은 technician_id 및 dos라고합니다.MySql select 쿼리 조인이 예상 답변을 제공하지 않음

로그 테이블에는 기술자에게 링크 된 작업이 포함될 수 있지만 작업자가 기술자를 위해 일을 시작한 경우 (즉, 기술자가 없을 때 날짜 (dos))에는 연결되지 않은 작업이 포함될 수 있습니다.

tech_logins 테이블의 login_date와 연결된 dos 날짜에 대해서만 각 기술자에 대해 모든 작업을 수행하려고합니다. 이 SQL은 단일 기술자 및 단일 날짜에 대한 레코드 만 반환합니다.

SELECT tech_logins.tech_id, 
     tech_logins.login_date 
FROM tech_logins 
INNER JOIN `logs` 
     ON tech_logins.login_date = `logs`.dos 
     AND tech_logins.tech_id = `logs`.technician_id 

모든 도움말 또는 지침을 매우 높이 평가할 것입니다.

테이블 구조는 :

CREATE TABLE `tech_logins` (
    `ID` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `tech_id` int(10) DEFAULT NULL, 
    `login_date` date DEFAULT NULL, 
    PRIMARY KEY (`ID`), 
    UNIQUE KEY `tech_id` (`tech_id`,`login_date`) 
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=latin1; 

CREATE TABLE `logs` (
    `ID` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `completed` date DEFAULT NULL, 
    `patient_first_name` varchar(20) NOT NULL, 
    `patient_last_name` varchar(20) NOT NULL, 
    `dob` date DEFAULT NULL, 
    `sex` varchar(1) DEFAULT NULL, 
    `dos` date DEFAULT NULL, 
    `study_id` int(10) DEFAULT NULL, 
    `ICD9` varchar(10) DEFAULT NULL, 
    `ref_doctor_id` int(10) DEFAULT NULL, 
    `insurance_id` int(10) DEFAULT NULL, 
    `insurance_no` varchar(20) DEFAULT NULL, 
    `authorization_no` varchar(20) DEFAULT NULL, 
    `referral_no` varchar(20) DEFAULT NULL, 
    `location_id` int(10) DEFAULT NULL, 
    `reading_doctor_id` int(10) DEFAULT NULL, 
    `technician_id` int(10) NOT NULL, 
    `biller` int(10) DEFAULT NULL, 
    `billed` tinyint(1) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`ID`) 
) ENGINE=MyISAM AUTO_INCREMENT=79 DEFAULT CHARSET=latin1; 
+1

설명이 약간 어렵습니다. 관련 테이블에 대한 CREATE TABLE 문을 게시하십시오. –

+1

데이터 샘플과 결과 세트로 기대할 수있는 것이 도움이 될 것입니다. –

답변

2

귀하의 질의 구조는 올바른 나타납니다. 실제로 두 테이블의 데이터가 두 조인 열에서 올바르게 일치하지 않는 데이터 문제가있을 수 있습니다.

먼저 tech_logins의 두 열 중 작은 세트를 먼저 선택해보십시오. tech_logins에서 반환 된 두 행의 두 열을 사용하여 로그 테이블을 쿼리합니다. 한 번에 한 걸음 씩 나오면 답을 찾을 수 있습니다. 당신은 올바르게 SQL을하고 있습니다. 이 내부가 남아있는 날짜 문제가 있는지 확인하기 위해 단지 참여와 참여 교체보다 작동하지 않는 경우

+0

에는 데이터 문제가 있습니다. 또한 테이블 구조가 조금 벗어났습니다. 이 테이블들 사이의 FK는'ID '에만 있어야합니다. –

+0

링크 된 필드는 괜찮아 보입니다. ID는 FK 여야하지만 login_date 및 tech_id를 사용해야합니다. – Saseow

+0

글쎄, 이것이 문제입니다. tech_logins 테이블에는 기술자 당 하루에 한 레코드 만 들어 있습니다. 로그 테이블에는 기술자 당 하루에 여러 개의 로그가있을 수 있습니다. 또한 로그 테이블에는 기술자가 없을 때 백 오피스 직원이 입력 한 기술자 레코드가 포함될 수 있습니다. 따라서 로그 테이블의 dos에 대한 tech_logins 항목이 없습니다. – Saseow

-1

변경 날짜가 업데이트

DATE_FORMAT(tech_logins.login_date, '%d %m  %Y') 
= DATE_FORMAT('logs'.dos, '%d %m %Y') 

을 다음과 같이 가입 할 수 있습니다.

+0

구문 오류 준다 : FROM tech_logins INNER tech_logins.tech_id가 ON 'logs' 가입 SELECT tech_logins.tech_id, tech_logins.login_date을 logs'.technician_id AND ='DATE_FORMAT (tech_logins.login_date '% d 개의 %의 ​​m % Y ') = DATE_FORMAT ('logs '.dos, '% d % m % Y') – Saseow

+0

'로그'를 로그로 바꿉니다. –

+0

왼쪽 결합과 구문 오류가 같습니다. – Saseow

관련 문제