2010-01-21 3 views
0

현재 작업 표 시스템에서 주어진 날짜의 시간을 기록하지 않은 모든 사용자를 반환하는 쿼리를 작성하려고합니다. 현재 2 개의 테이블, 작업 표 및 사용자가 있습니다. 날짜 범위에 대한 작업 표에 항목이없는 사용자 목록을 반환하는 쿼리를 만들려고합니다. 하루에 작업 표 테이블에는 단 하나의 레코드 만 있습니다.이 작업은 간단해야하지만 나 자신의 삶에 어떻게 접근해야하는지 알 수 없습니다.MySQL 부재자보고 스크립트

도움이 될 것입니다 :). 하루 동안 기록 된 시간이없는 경우 또한

 
+-----------------------+------------------+------+-----+---------+----------------+ 
| Field     | Type    | Null | Key | Default | Extra   | 
+-----------------------+------------------+------+-----+---------+----------------+ 
| timesheetID   | int(11) unsigned | NO | PRI | NULL | auto_increment | 
| timesheetForUser  | int(11) unsigned | NO |  |   |    | 
| timesheetForDate  | date    | NO |  |   |    | 
| timesheetForCheckIn | int(11)   | YES |  | NULL |    | 
| timesheetNotes  | text    | YES |  | NULL |    | 
| timesheetIsFilled  | tinyint(1)  | NO |  |   |    | 
| timesheetNoFillReason | int(11) unsigned | NO |  |   |    | 
| timesheetCreatedOn | datetime   | NO |  |   |    | 
| timesheetCreatedBy | int(11) unsigned | NO |  |   |    | 
| timesheetUpdatedOn | datetime   | YES |  | NULL |    | 
| timesheetUpdatedBy | int(11) unsigned | YES |  | NULL |    | 
+-----------------------+------------------+------+-----+---------+----------------+ 
 
+--------------------------------+---------------+------+-----+---------+----------------+ 
| Field       | Type   | Null | Key | Default | Extra   | 
+--------------------------------+---------------+------+-----+---------+----------------+ 
| userID       | int(11)  | NO | PRI | NULL | auto_increment | 
| userAccount     | int(11)  | YES |  | NULL |    | 
| userOrganization    | int(11)  | YES |  | NULL |    | 
| userIsEmployee     | tinyint(4) | YES |  | 0  |    | 
| userEmployeeSince    | date   | YES |  | NULL |    | 
| userName      | varchar(255) | YES |  | NULL |    | 
| userTitle      | varchar(255) | YES |  | NULL |    | 
| userEmail      | varchar(255) | YES |  | NULL |    | 
| userLogin      | varchar(50) | YES |  | NULL |    | 
| userPassword     | varchar(255) | YES |  | NULL |    | 
| userSendInvitation    | tinyint(4) | YES |  | NULL |    | 
| userAddress1     | varchar(255) | YES |  | NULL |    | 
| userAddress2     | varchar(255) | YES |  | NULL |    | 
| userCity      | varchar(255) | YES |  | NULL |    | 
| userCountry     | char(2)  | YES |  | NULL |    | 
| userState      | varchar(6) | YES |  | NULL |    | 
| userStateOther     | varchar(255) | YES |  | NULL |    | 
| userZip      | varchar(20) | YES |  | NULL |    | 
| userPhone      | varchar(50) | YES |  | NULL |    | 
| user_easypaycode    | varchar(6) | YES |  | NULL |    | 
| userFax      | varchar(50) | YES |  | NULL |    | 
| userCell      | varchar(50) | YES |  | NULL |    | 
| userTimezone     | int(11)  | YES |  | NULL |    | 
| userNotes      | text   | YES |  | NULL |    | 
| userActive      | tinyint(4) | NO |  | 0  |    | 
| userDisplayPictureType   | tinyint(4) | YES |  | NULL |    | 
| userDisplayPicture    | varchar(255) | YES |  | NULL |    | 
| userThumbnailPicture   | varchar(255) | YES |  | NULL |    | 
| userCanWriteMessages   | tinyint(4) | NO |  | 0  |    | 
| userCanWriteComments   | tinyint(4) | NO |  | 0  |    | 
| userCanUploadFiles    | tinyint(4) | NO |  | 0  |    | 
| userCanCreateEvents   | tinyint(4) | NO |  | 0  |    | 
| userCanCreateTickets   | tinyint(4) | NO |  | 0  |    | 
| userCanManageProjects   | tinyint(4) | NO |  | 0  |    | 
| userCanManageUsers    | tinyint(4) | NO |  | 0  |    | 
| userCanManageOrganizations  | tinyint(4) | NO |  | 0  |    | 
| userCanManageUserGroups  | tinyint(4) | NO |  | 0  |    | 
| userCanManageMessageCategories | tinyint(4) | NO |  | 0  |    | 
| userCanManageSetupOptions  | tinyint(4) | NO |  | 0  |    | 
| userCanManageAllUsersItems  | tinyint(4) | NO |  | 0  |    | 
| userCanEnterTimesheets   | tinyint(4) | NO |  |   |    | 
| userCanManageTimesheets  | tinyint(4) | NO |  |   |    | 
| userCanUseTimeclock   | tinyint(4) | YES |  | NULL |    | 
| userCanOnlyUseTimeclock  | tinyint(4) | YES |  | NULL |    | 
| userLastLogin     | datetime  | NO |  |   |    | 
| userPWResetText    | varchar(255) | YES |  | NULL |    | 
| userDeleted     | tinyint(4) | NO |  | 0  |    | 
| userDeletedBy     | int(11)  | YES |  | NULL |    | 
| userDeletedOn     | datetime  | YES |  | NULL |    | 
| userMinHoursPerDay    | decimal(10,1) | YES |  | NULL |    | 
+--------------------------------+---------------+------+-----+---------+----------------+ 
는 작업 표에서 만든 어떤 기록도 없다.

+0

수정하지 않고도 응답 할 수 있도록하려면 테이블 구조에 대한 자세한 정보가 필요합니다. –

+0

사용자가이 날짜에 대해 아무 것도 기록하지 않으면이 항목을 언급해야합니다. 시간 표 테이블에 레코드가 없습니다. –

+0

@Johnathan : 우리 모두가 짐작했다고 생각합니다. :) (관련) 열 이름은 귀하의 질문에 넣기에 유용한 정보가 될 것입니다. 당신은 그걸 압니까? –

답변

2
SELECT * FROM Users U 
    WHERE U.UserNo NOT IN (
    SELECT timesheetForUser FROM timesheets 
     WHERE timesheetForDate BETWEEN ??? AND ??? 
    ) 
+0

thx, 정확히 내가 필요로하는 것이 었습니다. 나는 어떻게 든 mysql이 서브 질의를 할 수 있다는 것을 잊을 수 있었다 : S. –

3

가 첫 번째 쿼리가 @start와 @end 사이에 등록이없는 모든 사용자를 가져옵니다 :

SELECT users.userName 
FROM users 
LEFT JOIN timesheets 
ON timesheets.timesheetForUser = users.userID 
AND timesheets.timesheetForDate BETWEEN @start AND @end 
WHERE timesheets.timesheetForUser IS NULL 

이 쿼리는 어떤 일을 누락하고 당신이 요청한가 (누락되는 일 모든 사용자를 가져옵니다 질문에 대한 코멘트) :

SELECT dates.timesheetForDate, users.userName 
FROM (SELECT DISTINCT timesheetForDate FROM timesheets) AS dates 
CROSS JOIN users 
LEFT JOIN timesheets 
    ON timesheets.timesheetForUser = users.userID 
    AND dates.timesheetForDate = timesheets.timesheetForDate 
WHERE timesheets.timesheetForUser IS NULL 

테스트 베드 : 아웃

CREATE TABLE timesheets (timesheetForUser int, timesheetForDate datetime); 
INSERT INTO timesheets (timesheetForUser, timesheetForDate) VALUES 
(1, '2010-01-01'), 
(2, '2010-01-01'), 
(3, '2010-01-01'), 
(1, '2010-01-02'), 
(3, '2010-01-02'), 
(2, '2010-01-03'), 
(2, '2010-01-04'), 
(3, '2010-01-04'); 

CREATE TABLE users (userId int, userName nvarchar(100)); 
INSERT INTO users (userId, userName) VALUES 
(1, 'Foo'), 
(2, 'Bar'), 
(3, 'Baz'); 

'2010-01-02 00:00:00', 'Bar' 
'2010-01-03 00:00:00', 'Foo' 
'2010-01-03 00:00:00', 'Baz' 
'2010-01-04 00:00:00', 'Foo' 

당신이 또한 뷰와 두 번째 쿼리를 작성하고이처럼 조회 할 수 있습니다 원하는 경우 : 테스트 베드를 사용하여 두 번째 쿼리에서 넣어

SELECT * FROM ViewMissingRegistrations 
WHERE timesheetForDate BETWEEN @start AND @end 
+0

시간이 기록되지 않은 날의 작업 표에 기록이 없으므로이 작업이 수행되지 않습니다. SQL을 실제로 오해하지 않는 한 S –

+1

@Jonathan, LEFT JOIN을 사용하고 있습니다. 즉, 오른손 테이블의 열에 NULL을 반환합니다. 당신의 질문을 오해하지 않는 한 그것은 잘 작동합니다. –

+0

@ Johnathan : 열 이름을 사용하도록 쿼리를 업데이트했습니다. 또한 질문에 대한 의견으로 입력 한 업데이트 된 질문에 대한 답변을 제공하는 두 번째 쿼리를 추가했습니다.두 번째 쿼리에는 테스트 베드가 포함되어있어 여기에서 작동하는지 확인할 수 있습니다. –

0

당신은 시도 할 수

SELECT u.* 
FROM Users u LEFT JOIN 
     timesheets t ON u.userid = t.userid 
WHERE t.Date BETWEEN '01 Jan 2009' AND '31 Jan 2009' 
AND  t.userID IS NULL 
+0

나는 이것이 작동하지 않을 것이라고 생각한다. 나는 t.userId가 null이면 t.DATE도 null이 될 것이므로 WHERE 절은 항상 false가 될 것입니다. 어쨌든 (열 이름을 적절하게 변경 한 후에) 위에서 게시 한 테스트 베드에 대한 행을 반환하지 않습니다. –

관련 문제