没有嵌套查询的SQL查询

时间:2008-11-12 19:05:37

标签: sql

假设我们有这些表格;

表用户:
- id
- 用户名
- 电子邮件

表user2group:
- 用户标识
- groupid

表组:
- id
- groupname

如何创建一个返回所有用户及其所属组的查询(作为结果集中的数组或其他内容..)

3 个答案:

答案 0 :(得分:7)

select u.id, u.username, u.email, g.groupid, g.groupname
from user u 
join user2group ug on u.userid=ug.userid
join group g on g.groupid=ug.groupid
order by u.userid

当您循环遍历结果集时,每次看到新的用户标识都会创建一个新的用户对象(或其他)并将组添加到其中。

答案 1 :(得分:3)

Eric的答案很棒,但我会使用LEFT JOIN而不是INNER来获取不属于任何组的用户。

SELECT 
  u.id, 
  u.username, 
  u.email, 
  g.groupid, 
  g.groupname
FROM 
  user u 
  LEFT JOIN user2group ug ON u.userid = ug.userid
  LEFT JOIN group g ON g.groupid = ug.groupid
ORDER BY 
  u.userid

答案 2 :(得分:0)

以上两者都或多或少都是正确的(如果每个用户都有一个组,则会更深)。但是他们也会为每个用户提供一些包含多个条目的结果集。

有一些方法可以将每个组成员连接成一个逗号分隔的字符串,我建议您在这里阅读: http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

我个人喜欢的另一种方法是使用位值而不是关系表user2group

表用户然后得到一个int(或bigint)字段组,并为每个组ID分配一个位值(即:1,2,4,8,16等等)用户表的组字段的值是然后是它分配给的groupID的总和。要查询它是否有一个组你做: where(group AND groupID = groupID)