1

我正在尝试正确执行 MYSQL 查询,但它没有做我想要的。

有人员表、任务表和与任务相关联的人员表。这是一个允许用户将人员分配给任务的页面。表具有用户 ID 字段,因为不同的用户正在处理不同的人员和/或任务组。对于每个任务,我想填充一个用户可以分配给任务的人员列表,其中排除任何已分配的人员。

表格如下: 人

id|person|userid

任务

id|task|userid

任务人

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,即没有人被分配给任务,它不会显示任何人,即返回零行。在这种情况下,它应该显示所有人。

任何人都可以看到我需要改变这个吗?

感谢您的任何建议

4

4 回答 4

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.

于 2013-02-07T11:23:49.213 回答
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;
于 2013-02-07T12:48:58.933 回答
0

我认为这里的问题在于,AND tp.personid NOT IN (....)如果 tp.personid 为 NULL,则此条件始终为 FALSE。所以你根本不需要 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' ) 
于 2013-02-07T11:42:10.343 回答
0

根据你的问题我推测...

创建表人(ID INTEGER,PERSON VARCHAR(20),USERID INTEGER);创建表任务(ID 整数,任务 VARCHAR(20),用户 ID 整数);CREATE TABLE TASKPERSON(ID INTEGER,PERSONID INTEGER,TASKID INTEGER);

插入人的价值观(1,“拉胡尔”,1);插入任务值(1,NULL,1);插入任务人员值(1,1,NULL);

插入人的价值观(1,“RAUNAK”,1);插入任务值(1,“R”,1);插入任务人员值(1,1,33);

插入人的价值观(2,“PARTH”,2);插入任务值(2,“P”,2);插入任务人员值(2,2,22);

插入人的价值观(3,“KANISK”,3);插入任务值(3,“K”,3);插入任务人员值(3,3,33);

插入人的价值观(4,“HEENA”,4);插入任务值(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
于 2013-02-07T13:53:10.503 回答