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句を含めると、テーブルに行がない場合、つまり問題のユーザーのタスクパーソン、つまりタスクに割り当てられているユーザーがいない場合、ユーザーは表示されません。つまり、ゼロ行が返されます。その場合はすべての人に表示されます。

誰かが私がこれを変更する必要がある場所を見つけることができますか?

提案をありがとう

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

あなたの質問によると私が推測すること...

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);

INSERT INTO PEOPLE VALUES(1、 "RAHUL"、1); INSERT INTO TASKS VALUES(1、NULL、1); TASKPERSON VALUES(1,1、NULL);に挿入します。

INSERT INTO PEOPLE VALUES(1、 "RAUNAK"、1); INSERT INTO TASKS VALUES(1、 "R"、1); TASKPERSON VALUES(1,1,33);に挿入します。

INSERT INTO PEOPLE VALUES(2、 "PARTH"、2); INSERT INTO TASKS VALUES(2、 "P"、2); TASKPERSON VALUES(2,2,22);に挿入します。

INSERT INTO PEOPLE VALUES(3、 "KANISHK"、3); INSERT INTO TASKS VALUES(3、 "K"、3); TASKPERSON VALUES(3,3,33);に挿入します。

INSERT INTO PEOPLE VALUES(4、 "HEENA"、4); INSERT INTO TASKS VALUES(4、NULL、4); TASKPERSON VALUES(4,4、NULL);に挿入します。

「NOTIN」を含めない場合は、割り当てられていない人のリストを取得します。

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 に答える
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

よくわかりませんが、おそらくこれがあなたの求めているものです...

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 に答える