2013-01-09 3 views
1

일부 테이블의 일부 열을 갖고 싶습니다. 사용자에게 문제가 있습니다. userId은 0 일 수 있지만 null으로 반환해야합니다. 나는이 간단한 조합 문을 수행 할 때, 그 결과는 다음과 같습니다select union SQL 문의 문제

SELECT 
     a.appointmentId, 
     u.prename AS user_prename, 
     u.lastname AS user_lastname, 
     a.start AS START , 
     a.end AS END , 
     w.workerId AS workerid 
FROM ios_appointments a 
    JOIN ios_user u 
    JOIN ios_worker w 
    JOIN ios_partners p 
WHERE a.workerid_fk = w.workerid 
    AND w.partnerid_fk = p.partnerid 
    AND a.userid_fk = u.userid 
    AND p.code = 'DEMO6003' 
union 
select 
    a.appointmentId, 
    null, 
    null, 
    a.start AS START , 
    a.end AS END , 
    w.workerId AS workerid 
from ios_appointments a 
    JOIN ios_user u 
    JOIN ios_worker w 
    JOIN ios_partners p 
where 
    a.userid_fk = 0; 

예상 결과 :

43 NULL NULL 2013-01-10 02:00:00 2013-01-10 02:30:00 3 

실제 결과 :

43 NULL NULL 2013-01-10 02:00:00 2013-01-10 02:30:00 1 
43 NULL NULL 2013-01-10 02:00:00 2013-01-10 02:30:00 2 
43 NULL NULL 2013-01-10 02:00:00 2013-01-10 02:30:00 3 

문제가 : 이 문은 반환을 데이터베이스에 등록 된 각 작업자에 대한 행. 어떻게 해결할 수 있습니까?

테이블 스키마

CREATE TABLE `ios_workinghours` (
    `workingHourId` int(11) NOT NULL AUTO_INCREMENT, 
    `start` time DEFAULT NULL, 
    `end` time DEFAULT NULL, 
    `workerid_fk` int(11) NOT NULL, 
    PRIMARY KEY (`workingHourId`), 
    KEY `workerid_fk` (`workerid_fk`) 
) 

create table ios_worker (
    workerid int not null auto_increment, 
    prename varchar(255), 
    lastname varchar(255), 
    avatar varchar(255), 
    lineup varchar(255), 
    languages varchar(255), 
    partnerid_fk int not null, 
    primary key(workerid), 
    foreign key(partnerid_fk) references ios_partners(partnerid) 
) 

create table ios_user (
    userid int not null auto_increment, 
    prename varchar(255), 
    lastname varchar(255), 
    phone varchar(255), 
    email varchar(255), 
    password varchar(255), 
    primary key (userid) 
) 

create table ios_partners (
    partnerid int not null auto_increment, 
    code varchar(255), 
    partnerName varchar(255), 
    street varchar(255), 
    zipCode varchar(255), 
    city varchar(255), 
    languages varchar(255), 
    workers varchar(255), 
    lineup varchar(255), 
    primary key(partnerid) 
) 
+1

당신이 관련 테이블 스키마 – Kermit

+1

을 게시하는 경우 여러 ios_worker 기록이있는 경우 그런 다음, 도움이 될 것입니다 이것은 예상되는 동작입니다. MAX를 반환하려고하십니까? – sgeddes

+0

당신의 기대는 거짓이다. 일대 다 시나리오를 가지고 있더라도 "유니언"과의 고유성을 강요합니다. p.code가 'DEMO6003'이고 레코드가 userid_fk가 0 인 레코드를 가져 오는 경우 세 개의 별개 workerID가 있습니다. 이 경우가되어야합니다. 어떻게하면 더 잘할 수 있는지 알기 위해서 우리가이 일을하는 이유에 대해 더 많이 알 필요가 있습니다. @njk이 말했듯이, 테이블 스키마를 알고 있습니다. –

답변

3

두 번째 쿼리가 여전히 가입 기준을 적용해야합니다 :

FROM ios_appointments a 
    JOIN ios_user u 
    JOIN ios_worker w 
    JOIN ios_partners p 
WHERE a.workerid_fk = w.workerid 
    AND w.partnerid_fk = p.partnerid 
    AND a.userid_fk = u.userid 
    AND a.userid_fk = 0 
+0

바보 같이, 고마워! – doonot