【发布时间】:2019-05-28 19:45:59
【问题描述】:
正在将所有用户选择到其中不存在的 html <select> 中。
我正在开发一个“案例”网站,我可以将用户放在案例中。用户可以同时处理多个案例。我正在制作一个 html <select>,其中包含我可以添加到案例中的所有用户,重要的是不显示该案例中的现有用户。
我有 3 个 SQL 表。 Users、Cases 和 Junc_jobs。 Junc_Jobs 作为多对多关系连接用户和案例。我要选择的所有用户都是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 只显示每个用户中的一个,但也显示了已经在案例中并有其他案例的用户。
【问题讨论】:
-
你的 WHERE 条件可以简化为
(fk_case IS NULL OR fk_case != 66) AND users.fk_role > 1 -
您包括当前的输出,但您希望的输出是什么?因为如果您正在寻找案例 66 的用户,那么 fk_case 应该与 SELECT 组合无关
-
为什么
users表有fk_case列?这不是junc_jobs表的用途吗?users中的fk_role列在哪里? -
@Barmar 也许是当前的一个或第一个案例?反正不应该在那里