我正在尝试正确获取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子句,当表中没有行时,相关用户的任务人员,即没有人被分配给任务,则不显示任何人,即返回零行。它应该显示那种情况下的所有人。
有人能看出我需要改变的地方吗?
感谢您的任何建议
答案 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