Как <select>только нет существующих пользователей из дела.SQL SELECT - PullRequest
0 голосов
/ 28 мая 2019

Работает над выбором всех пользователей в html <select>, которого там еще нет.

Я работаю над «делом» на сайте, где я могу ставить пользователей на дела. Пользователи могут быть наложены на несколько дел одновременно. Я делаю HTML <select> со всеми пользователями, которых могу добавить в дело, и важно, чтобы уже существующие пользователи в этом деле не отображались.

У меня есть 3 таблицы SQL. Users, Cases и Junc_jobs. Junc_ J obs работает как отношения «многие ко многим» для связи пользователей и дел. Все пользователи, которых я хочу выбрать: fk_role > 1.

USERS
+-------+------------+----------+
|  id   | firstName  | fk_case  |
+-------+------------+----------+
|  05   | Rasmus     | 57       |
|  06   | Ulrik      | 57       |
|  10   | Nick       | 59       |
|  12   | Lisa       | 59       |
|  22   | Marco      | 65       |
|  23   | Frederik   | 63       |
+-------+------------+----------+

CASES
+-------+------------+
|  id   | caseName   | 
+-------+------------+
|  57   | case 1     | 
|  59   | case 2     | 
|  63   | case 3     | 
|  64   | case 4     |
|  65   | case 5     | 
+-------+------------+

JUNC_JOBS
+-------+------------+--------------+
|  id   | fk_case    | fk_employee  |
+-------+------------+--------------+
|  1    | 57         | 5            |
|  2    | 59         | 5            |
|  3    | 64         | 23           |
|  4    | 65         | 23           |
|  5    | 65         | 22           |
|  6    | 66         | 10           |
|  7    | 61         | 22           |
|  8    | 60         | 5            |
|  9    | 63         | 5            |
|  10   | 66         | 22           |
|  11   | 62         | 12           |
+-------+------------+--------------+

Пока я пытался сделать что-то вроде этого:

SELECT users.id, users.firstName, users.lastName, junc_jobs.fk_case FROM users
LEFT JOIN junc_jobs ON users.id = junc_jobs.fk_employee
WHERE (fk_case IS NULL AND users.fk_role > 1) OR (fk_case != 66 AND  users.fk_role > 1)
ORDER BY firstName

НО, если junc_jobs содержит пользователей с несколькими случаями, он перестает работать. Мы получаем что-то вроде этого:

+-------+------------+----------+
|  id   | firstName  | fk_case  |
+-------+------------+----------+
|  06   | Ulrik      | 57       |
|  05   | Rasmus     | 57       |
|  12   | Lisa       | 59       |
|  10   | Nick       | 59       |
|  05   | Rasmus     | 59       |
|  23   | Frederik   | 63       |
|  06   | Macro      | 63       |
|  23   | Frederik   | 64       |
|  23   | Frederik   | 65       |
|  22   | Marco      | 65       |
|  10   | Nick       | 65       |
+-------+------------+----------+

Как видите, пользователи, находящиеся на fk_case = 66, удаляются, но если этот пользователь уже находится в других случаях, они все равно отображаются. Пользователь с id = 22 находится на fk_case 66, и этот пользователь полностью удален из списка.

Я пытался использовать GROUP BY ID, чтобы показать только одного из каждого пользователя, но также отображаются пользователи, которые уже находятся в деле и имеют другие дела.

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Поместите тест fk_case в предложение ON, а затем показывайте только пользователей без совпадений.

SELECT DISTINCT u.id, u.firstName, u.lastName
FROM users as U
LEFT JOIN junc_jobs AS j ON u.id = j.fk_employee AND j.fk_case = 66
WHERE j.fk_case IS NULL AND u.fk_role > 1
0 голосов
/ 28 мая 2019

Я не думаю, что вам нужно fk_case для SELECT, потому что, если пользователь участвует в других проектах, не имеет значения.Только то, что он не на текущем.

SELECT DISTINCT users.id, users.firstName, users.lastName
FROM users
LEFT JOIN junc_jobs ON users.id = junc_jobs.fk_employee
WHERE users.fk_role > 1
  AND (fk_case IS NULL OR fk_case != 66)
ORDER BY firstName

Также не уверен, что делает junc_jobs, но, возможно, что-то подобное может помочь

SELECT u.*
FROM users u
WHERE u.fk_role > 1
  AND NOT EXISTS ( SELECT 1 
                   FROM junc_jobs j 
                   WHERE j.fk_employee = u.id and j.fk_case = 66)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...