MYSQL QUERY SYNTAX: левое соединение правильно исключает совпадения

Я пытаюсь получить запрос MYSQL правильно, и он не делает то, что я хочу.

Есть таблица людей, таблица задач и таблица людей, связанных с задачами. Это страница, которая позволяет пользователям назначать людей задачам. Таблицы имеют поля userid, так как разные пользователи работают с разными группами людей и/или задачами. Для каждой задачи я хочу заполнить список людей, которые пользователь может назначить для задачи, которая исключает всех уже назначенных людей.

Таблицы заключаются в следующем: люди

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, когда в таблице нет строк, то задача для данного пользователя, то есть никто не был назначен этой задаче, он не показывает никаких людей, т.е. возвращает нулевые строки. Он должен показать всех людей в этом случае.

Может ли кто-нибудь увидеть, где мне нужно изменить это?

Спасибо за любые предложения

1
nl ja de
попробуйте изменить имя псевдонима таблицы taskperson во внутреннем запросе на tp1. может быть результатом ambigiuos - что-то вроде SELECT tp1.personid FROM taskperson` tp1`
добавлено автор Bhavik Shah, источник

4 ответы

Я думаю, вам нужно 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
добавлено

Я не уверен, но, возможно, это то, что вам нужно ...

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
добавлено

Я думаю, что проблема здесь в условии AND tp.personid NOT IN (....) , если tp.personid равно NULL, тогда это условие ВСЕГДА ЛОЖЬ. Таким образом, вам не нужно ЛЕВОЕ ПРИСОЕДИНЕНИЕ вообще.

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
добавлено

Что я догадываюсь по твоему вопросу ...

СОЗДАТЬ ТАБЛИЦУ ЛЮДЕЙ (ID INTEGER, PERSON VARCHAR (20), USERID INTEGER);   CREATE TABLE TASKS (ID INTEGER, TASK VARCHAR (20), USERID INTEGER); СОЗДАЙТЕ   TABLE TASKPERSON (ID INTEGER, PERSONID INTEGER, TASKID INTEGER);

     

ВСТАВИТЬ В НАРОДНЫЕ ЗНАЧЕНИЯ (1, «РАХУЛ», 1); ВСТАВИТЬ В ЗАДАЧИ   VALUES (1, NULL, 1); ВСТАВИТЬ В ЦЕННОСТИ ТАСКПЕРСОНА (1,1, NULL);

     

ВСТАВИТЬ В НАРОДНЫЕ ЗНАЧЕНИЯ (1, «РАНАК», 1); ВСТАВИТЬ В ЗАДАЧИ   VALUES (1, "R", 1); ВСТАВЬТЕ В ЦЕЛЯХ ТАСКПЕРСОНА (1,1,33);

     

ВСТАВИТЬ В НАРОДНЫЕ ЗНАЧЕНИЯ (2, «ЧАСТЬ», 2); ВСТАВИТЬ В ЗАДАЧИ   ЗНАЧЕНИЯ (2, "Р", 2); ВСТАВЬТЕ В ЦЕЛЯХ ТАСКПЕРСОНА (2,2,22);

     

ВСТАВЬТЕ ЗНАЧЕНИЯ ЛЮДЕЙ (3, «KANISHK», 3); ВСТАВИТЬ В ЗАДАЧИ   ЗНАЧЕНИЯ (3, "К", 3); ВСТАВИТЬ В ЦЕЛЯХ ЗАДАЧИ (3,3,33);

     

ВСТАВИТЬ В НАРОДНЫЕ ЗНАЧЕНИЯ (4, «ХЕЕНА», 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
0
добавлено
DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
1 345 участник(ов)

Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.

MySQL
MySQL
995 участник(ов)

The group is about MySQL. For code use hastebin.com. Admin: @smlkw