MYSQL查询语法:左连接正确排除匹配

时间:2013-02-07 11:09:10

标签: mysql syntax

我正在尝试正确获取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子句,当表中没有行时,相关用户的任务人员,即没有人被分配给任务,则不显示任何人,即返回零行。它应该显示那种情况下的所有人。

有人能看出我需要改变的地方吗?

感谢您的任何建议

4 个答案:

答案 0 :(得分: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没有匹配的人。

答案 1 :(得分: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' ) 

答案 2 :(得分: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;

答案 3 :(得分:0)

根据你的问题,我猜测是什么......

  

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

     

插入人民价值观(1,“RAHUL”,1);插入任务   VALUES(1,NULL,1);插入TASKPERSON VALUES(1,1,NULL);

     

插入人民价值观(1,“RAUNAK”,1);插入任务   值(1, “R”,1);插入TASKPERSON VALUES(1,1,33);

     

插入人民价值观(2,“PARTH”,2);插入任务   VALUES(2, “P”,2);插入TASKPERSON VALUES(2,2,22);

     

插入人民价值观(3,“KANISHK”,3);插入任务   VALUES(3, “K”,3);插入TASKPERSON VALUES(3,3,33);

     

插入人民价值观(4,“HEENA”,4);插入任务   VALUES(4,NULL,4);插入TASKPERSON VALUES(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