如何从案例中<select> 仅没有现有用户。 SQL 选择

Posted

技术标签:

【中文标题】如何从案例中<select> 仅没有现有用户。 SQL 选择【英文标题】:How to <select> only none existing users from a case. SQL SELECT 【发布时间】:2019-05-28 19:45:59 【问题描述】:

正在将所有用户选择到其中不存在的 html &lt;select&gt; 中。

我正在开发一个“案例”网站,我可以将用户放在案例中。用户可以同时处理多个案例。我正在制作一个 html &lt;select&gt;,其中包含我可以添加到案例中的所有用户,重要的是不显示该案例中的现有用户。

我有 3 个 SQL 表。 UsersCasesJunc_jobs。 Junc_Jobs 作为多对多关系连接用户和案例。我要选择的所有用户都是fk_role &gt; 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 &gt; 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> 下拉标题下方

从 Vue <select> @change 事件中获取两个值

Vue,品牌列表案例(仅添加)

django - 从 HTML <select> 收集数据

如何在 SQL Select 语句中仅比较日期(无时间戳)

Blazor:在使用 @bind 时如何在 <select> 中使用 onchange 事件?