2013-02-07 63 views
1

我想獲得一個MYSQL查詢權利,它不是做我想做的。MYSQL查詢語法:左加入正確排除匹配

有桌子的人,任務表和任務表的人鏈接到任務。這是用於讓用戶將任務分配給人的頁面。由於不同的用戶正在處理不同的人員和/或任務組,因此表格具有用戶ID字段。對於每項任務,我想填充用戶可以分配給排除任何已分配人員的任務的人員列表。

表如下: 人

id|person|userid 

任務

id|task|userid 

taskperson

id|personid|taskid 

我一起工作的查詢是:

SELECT p.*,p.id as pid 
FROM `people` p 
LEFT JOIN `taskperson` tp 
on p.id = tp.personid 
WHERE p.person LIKE '%$str%' AND p.userid = '1'AND tp.personid NOT IN 
(SELECT tp.personid FROM `taskperson` tp WHERE userid = '1' AND tp.taskid = '33') 
GROUP BY p.id 

如果您刪除NOT IN子句,它會給你一個人員列表,但不會排除已經分配的人員。

如果包含NOT IN子句,當表中沒有行時,有問題的用戶的taskperson(即沒有人被分配給任務),它不顯示任何人,即返回零行。它應該顯示所有人在這種情況下。

任何人都可以看到我需要改變這個?

感謝您的任何建議

+0

嘗試將內部查詢中的任務人員表的別名更改爲tp1。可能會導致ambigiuos - 類似於'SELECT tp1.personid FROM'taskperson' tp1' –

回答

1

我認爲你需要IS NULL

SELECT p.*,p.id as pid 
FROM `people` p 
LEFT JOIN `taskperson` tp 
on p.id = tp.personid 
WHERE p.person LIKE '%$str%' AND p.userid = '1' AND tp.personid IS NULL 
GROUP BY p.id 

從刪除NOT IN子句中判斷,這將排除已分配的人員。 WHERE tp.personid IS NULL將只顯示那些與LEFT JOIN沒有匹配的人。

0

我認爲這裏的問題是在條件AND tp.personid NOT IN (....)如果tp.personid是NULL,那麼這個條件總是假。所以你根本不需要LEFT JOIN。

SELECT p.*,p.id as pid 
FROM `people` p 
WHERE p.person LIKE '%$str%' AND p.userid = '1'AND p.id NOT IN 
(SELECT tp.personid FROM `taskperson` tp WHERE userid = '1' AND tp.taskid = '33') 
0

我不知道,但也許這就是你追求的...

SELECT DISTINCT p.* 
    FROM people p 
    LEFT 
    JOIN taskperson tp 
    ON tp.personid = p.id 
    AND taskid = 33 
WHERE p.person LIKE '%$str%' 
    AND p.userid = 1 
    AND tp.personid IS NULL; 
0

我根據你的問題揣什麼?

CREATE TABLE PEOPLE(ID INTEGER,PERSON VARCHAR(20),USERID INTEGER); CREATE TABLE TASKS(ID INTEGER,TASK VARCHAR(20),USERID INTEGER); CREATE TABLE TASKPERSON(ID INTEGER,PERSONID INTEGER,TASKID INTEGER);

插入人的價值(1,「RAHUL」,1); INSERT INTO TASKS VALUES(1,NULL,1);插入任務值(1,1,NULL);

插入人的價值(1,「RAUNAK」,1); INSERT INTO TASKS VALUES(1,「R」,1);插入任務值(1,1,33);插入人物價值(2,「PARTH」,2); INSERT INTO TASKS VALUES(2,「P」,2);插入任務值(2,2,22);插入人物價值(3,「KANISHK」,3); INSERT INTO TASKS VALUES(3,「K」,3);插入任務值(3,3,33);插入人物價值(4,「HEENA」,4); INSERT INTO TASKS VALUES(4,NULL,4);插入任務值(4,4,NULL);

如果不包含「NOT IN」,您將檢索那些未分配人員的列表。

SELECT P.*,P.ID FROM PEOPLE P LEFT JOIN TASKPERSON TP ON P.ID=TP.PERSONID 
WHERE P.USERID=1 AND TP.PERSONID IN(SELECT TP.PERSONID FROM TASKPERSON TP WHERE TP.PERSONID=1 AND TP.TASKID=33) 
GROUP BY P.ID