0

从用户、组、u2g 中选择 u.user、g.group、u2g.something,其中 users.u = u2g.u 和 groups.g = u2g.g

返回如下数据:

user, group, something
----------------------
1   , 3,     a
1   , 5,     b
2   , 3,     c
3   , 3,     d
4   , 5,     e

现在我想限制这个查询,使其只显示第 3 组和第 5 组中的用户-所以它只会返回 {1,3, a} , {1,5, b} 用于我的示例数据.

编辑:我在数据中添加了另一列,因为使用 group by 可能存在不正确的解决方案。

edit2:对不起,我被文档误导了。MySQL 4.0 不支持子查询 :(

编辑 3:此 SQL 将以编程方式为任意数量的组生成(嗯,在当前规范中最多 20 个),所以我想避免给我太多额外编码的解决方案。如果找不到解决方案,我将只修改生成的 .Net 1.1 DataTable,但如果可能的话,我想避免这种情况。

编辑4:有什么新想法吗?也许一个没有包含 IN (3,5) 的子查询?

4

5 回答 5

1
select u.user, g.group, u2g.something 
from users u, groups g, u2g 
where u.user = u2g.user and g.group = u2g.group 
    where exists 
     (select 1 
         from u2g u2g2 
        where u2g2.user=u.user and u2g2.group in(3,5))
于 2009-01-28T10:16:33.883 回答
1

这些方面的东西?

select u.[user], g.group
from     u
    inner join ug on ug.userid = u.id   
    inner join g on g.id = ug.groupid
    inner join 
    (
        select ug.userid
        from ug
        where ug.groupid in (1,2)
        group by ug.userid
        having count(*) = 2
    ) sub on sub.userid = u.id

-Edoode

于 2009-01-28T10:34:32.430 回答
1

使用带有 groups-table 的双重联接将为您提供正确的结果:

  选择 u.user, u2g.something
  来自用户
  内部联接 u2g ON users.u = u2g.u
  u2g.g = g1.g 和 g1.group = 3 上的内部连接组 g1
  INNER JOIN 组 g2 ON u2g.g = g2.g AND g2.group = 5
  /* 尝试两行,每组一个 */
  u2g.g = groups.g 上的 INNER JOIN 组

但是,这并不完全符合您的要求,即您需要两行,每组一行。这只会给你一行,你可能可以再次加入它与组,从而呈现两行。

另一个示例(如果您选择使用与映射相同的 groupID):

选择 u.uID,gm.something
FROM cdcms_users 你
内部连接 ​​cdcms_group_memberships gm1 on gm1.uID = u.uID AND gm1.gID = 32
内部连接 ​​cdcms_group_memberships gm2 on gm2.uID = u.uID AND gm2.gID = 33
于 2009-01-28T10:45:13.327 回答
1

相当可怕的非通用解决方案,导致 Oracle 中出现两行:

  select users.u, groups.g
    from   users , groups, u2g, groups g2, u2g u2g2
    where  users.u = u2g.u 
           and users.u = u2g2.u
           and groups.g = u2g.g
           and g2.g = u2g2.g
           and (groups.g in (3,5) and g2.g in (3,5) and groups.g <> g2.g)
           ;
于 2009-01-28T11:52:31.447 回答
1

为什么groups在查询中使用?其唯一访问的字段 ( g) 存在于u2g. 我想你可能也想从那里带回一大堆东西。

为了在不使用子查询的情况下获得您描述的那种结果集,您最终会遇到一团糟:查询文本的二次爆炸!

你需要以下形式的东西:

select users.u, groups.g, u2g0.something
from users u, groups g, u2g u2g0, u2g u2g1
where groups.g = 3
     and users.u = u2g0.u
     and u2g0.g = 3
     and users.u = u2g1.u
     and u2g1.g = 5
union all
select users.u, groups.g, u2g1.something
from users u, groups g, u2g u2g0, u2g u2g1
where groups.g = 5
     and users.u = u2g0.u
     and u2g0.g = 3
     and users.u = u2g1.u
     and u2g1.g = 5

由于这是一个以编程方式生成的查询,因此我将在此处使用类似网页脚本的符号来描述查询构造。我还将做出轻率和毫无根据的简化假设,即组标识符不是潜在的 SQL 注入攻击向量。:-)

<% for(int i = 0; i < requiredGroups.Length; i++) { %>
  <% if(i > 0) { %>
    union all
  <% } %>
select users.u, groups.g, u2g<%=i%>.something
from users u, groups g
  <% for(int j = 0; j < requiredGroups.Length; j++) { %>
     , u2g u2g<%=j%>
  <% } %>
where groups.g = <%=requiredGroups[i]%>
  <% for(int j = 0; j < requiredGroups.Length; j++) { %>
     and users.u = u2g<%=j%>.u
     and u2g<%=j>.g = <%=requiredGroups[j]%>
  <% } %>
<% } %>
于 2009-01-29T23:16:21.340 回答