2013-01-09 110 views
1

我想要某些表中的某些列。我對用戶有問題。 userId可以是0,但我想要它返回爲null。當我用這個簡單的聯合聲明中這樣做,結果是這樣的:選擇聯合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

你的期望是錯誤的。即使你有一對多的情況,你也會強迫「聯盟」的獨特性。如果您使用pCode爲'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