我有一张表,用于在我的数据库中构建组。该表包含组名称和 ID 的列表。我有另一个包含用户的表,以及显示关系的第三个表。(用户标识,组标识)。
情况是这样的,我需要创建一个属于特定组子集的用户 ID 列表。例如,我想要组 1、3 和 8 中的所有用户。这很简单。但它变得更加复杂,我可能需要一个包含在组 1、3 和 8 或 1、2 和 8 中的所有用户的列表。然后我可能需要排除符合该标准但也在组中的用户27.
所以我有一个脚本动态地创建一个查询,使用子查询在一定程度上起作用。我有两个问题。我认为我没有正确处理非部分,因为当我广告标准时,最终它只是有点挂起。(我认为这是我使用子选择而不是连接的结果,但我无法弄清楚如何使用连接来构建它。)
下面是一个带有 4 个 ANDed OR 组和 2 个 NOT 子句的查询示例。
请让我知道是否有更好的方法来优化这个 stmt。(我可以在 PHP 中处理它的动态构建)
如果我需要澄清任何事情或提供更多细节,请告诉我。
select * from users_table where username IN
(
select user_id from
(
select distinct user_id from group_user_map where user_id in
(
select user_id from
(
select * from
(
select count(*) as counter, user_id from
(
(
select distinct(user_id) from group_user_map where group_id in (2601,119)
)
union all
(
select distinct(user_id) from group_user_map where group_id in (58,226)
)
union all
(
select distinct(user_id) from group_user_map where group_id in (1299,525)
)
union all
(
select distinct(user_id) from group_user_map where group_id in (2524,128)
)
)
thegroups group by user_id
)
getall where counter = 4
)
getuserids
)
and user_id not in
(
select user_id from group_user_map where group_id in (2572)
)
)
biggergroup
);
请注意,查询的第一部分是将 id 与用户名进行比较。这是因为我将用户名存储为另一个表中的 id。(这整个事情是两个完全不同的数据库之间的链接)。
(另外,如果看起来我有任何额外的子查询,那就是试图强制 mysql 首先评估内部查询。)
谢谢。
亚伦。