gpt4 book ai didi

MySQL:排除

转载 作者:行者123 更新时间:2023-11-29 04:27:05 28 4
gpt4 key购买 nike

我有一个名为“members”的数据库表。分配给成员的是一个职位

职位 来自部门。我有 Departments,然后是那些中的 Sub-Departments 和 Sub-Departments 中的 Positions。

希望我没有失去你。

我想要做的是选择一个部门内的所有成员,排除该部门内某个职位的任何成员。

“部门”表:(包括部门和子部门)

ID     NAME                  PARENT_ID
1 Department #1 NULL
2 Department #2 NULL
3 Sub Department #1 1
4 Sub Department #2 1
5 Sub Department #3 2

“部门职位”表:

ID     NAME             SUB_DEPARTMENT_ID
1 Position #1 3
2 Position #2 3
3 Position #3 4

“members_positions”表:

ID     MEMBER_ID     POSITION_ID
1 1 1
2 1 2
3 1 3

这是我的 MySQL 代码:

SELECT m.* FROM members AS m 
LEFT JOIN members_positions AS mp ON mp.member_id = m.id
LEFT JOIN departments_positions AS dp ON mp.position_id = dp.id
LEFT JOIN departments AS sd ON dp.sub_department_id = sd.id
LEFT JOIN departments AS d ON sd.parent_id = d.id
WHERE mp.position_id != '2' AND d.id = '1'
GROUP BY m.id

如您所见,我想提取“部门 #1”(部门表中的 ID:1)中的成员,但不提取该部门职位 #2(部门位置表中的 ID:2)中的成员。

希望我说得有道理。我上面的代码似乎不起作用。它只是导出部门中的每个人。

最佳答案

因为你用的是LEFT JOIN,不会过滤数据。

更改您的查询以使用 INNER JOIN。

如果您按成员(member) ID 分组,您也不能使用 select *。

编辑:我将您的表输入到本地 mysql 数据库并确认此查询有效。

SELECT DISTINCT mp.member_id
FROM members_positions mp
INNER JOIN departments_positions dp ON dp.id = mp.position_id
AND mp.position_id != 2
INNER JOIN departments sd on sd.id = dp.sub_department_id
AND sd.parent_id = 1
GROUP BY mp.member_id

此外,您为什么要在 where 语句中引用 int 值 2 和 1?

如果您只需要唯一的成员(member) ID,则无需执行 GROUP BY。您应该将选择切换为此,然后使用外部选择来获取所有成员信息:

SELECT m.* 
FROM members m
INNER JOIN (
SELECT DISTINCT mp.member_id
... the rest...
) innerQ ON innerQ.member_id = m.id

关于MySQL:排除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9405076/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com