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

时间:2019-05-28 19:46:00

标签: html mysql sql

正在将所有用户选择到尚不存在的html ,并且不显示该案例中已经存在的用户非常重要。 我有3个SQL表。用户,案例和Junc_jobs。 Junc_Jobs与用户和案例之间建立了多对多关系。我要选择的所有用户都是fk_role> 1。 用户 + ------- + ------------ + ---------- + | id |名字| fk_case | + ------- + ------------ + ---------- + | 05 |拉斯穆斯| 57 | | 06 | Ulrik | 57 | | 10 |尼克| 59 | | 12 |丽莎| 59 | | 22 |马可| 65 | | 23 |弗雷德里克| 63 | + ------- + ------------ + ---------- + 案例 + ------- + ------------ + | id | caseName | + ------- + ------------ + | 57 |案例1 | | 59 |案例2 | | 63 |案例3 | | 64 |案例4 | | 65 |案例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 | + ------- + ------------ + -------------- + 到目前为止,我已经尝试过执行以下操作: 从用户中选择users.id,users.firstName,users.lastName,junc_jobs.fk_case 左加入junc_jobs ON users.id = junc_jobs.fk_employee 在哪里(fk_case为NULL AND users.fk_role> 1)或(fk_case!= 66 AND users.fk_role> 1) 按名字订购 但是,如果junc_jobs包含具有多种情况的用户,它将停止工作。我们得到这样的东西: + ------- + ------------ + ---------- + | id |名字| fk_case | + ------- + ------------ + ---------- + | 06 | Ulrik | 57 | | 05 |拉斯穆斯| 57 | | 12 |丽莎| 59 | | 10 |尼克| 59 | | 05 |拉斯穆斯| 59 | | 23 |弗雷德里克| 63 | | 06 |宏| 63 | | 23 |弗雷德里克| 64 | | 23 |弗雷德里克| 65 | | 22 |马可| 65 | | 10 |尼克| 65 | + ------- + ------------ + ---------- + 如您所见,位于fk_case = 66的用户已被删除,但是如果该用户已经处于其他情况下,他们仍会显示。 id = 22的用户位于fk_case 66上,并且该用户已从列表中完全删除。 我尝试使用GROUP BY ID仅显示每个用户之一,但是也显示了该案例中已经存在的用户和其他案例的用户。

2 个答案:

答案 0 :(得分:0)

我认为您不需要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)

答案 1 :(得分:0)

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