假设我们有这些表格;
表用户:
- id
- 用户名
- 电子邮件
表user2group:
- 用户标识
- groupid
表组:
- id
- groupname
如何创建一个返回所有用户及其所属组的查询(作为结果集中的数组或其他内容..)
答案 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)