致力于将所有用户选择到一个尚不存在的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
只显示每个用户中的一个,但也会显示已经在案例中并有其他案例的用户。
将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
我认为你不需要fk_case
来选择,因为如果用户在其他项目上并不重要。只是重要的是他不在当前的那个上。
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)