如何从案例中<select> 仅没有现有用户。 SQL 选择
Posted
技术标签:
【中文标题】如何从案例中<select> 仅没有现有用户。 SQL 选择【英文标题】:How to <select> only none existing users from a case. SQL SELECT 【发布时间】:2019-05-28 19:45:59 【问题描述】:正在将所有用户选择到其中不存在的 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
只显示每个用户中的一个,但也显示了已经在案例中并有其他案例的用户。
【问题讨论】:
你的 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 也许是当前的一个或第一个案例?反正不应该在那里
【参考方案1】:
将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_role > 添加到 WHERE。我不知道可以在 LEFT JOIN 上添加 AND。非常感谢您的帮助^^【参考方案2】:我认为 SELECT 不需要 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)
【讨论】:
以上是关于如何从案例中<select> 仅没有现有用户。 SQL 选择的主要内容,如果未能解决你的问题,请参考以下文章
如何仅使用 html 和 css 使 <options> 显示在 <select> 下拉标题下方