2010-05-05 92 views
1

我有一个小的sql问题。来自2个表的SQL select语句

我有2个表

成员和经理

成员有:MEMBERID,姓名,地址 经理有:MEMBERID,EditRights,DeleteRights

EditRights和DeleteRights是类型位。

管理员与成员有关系,因为他们本身就是成员。

我想选择所有成员的ID,姓名和地址,以及经理显示他们是否具有编辑权限和/或删除权限的成员。

SO:

〔实施例的数据

成员:

ID, Name, Address 
1, tom, 2 flat 
2, dan, 3 flat 
3, ben, 4 flat 
4, bob, 6 flat 
5, sam, 9 flat 

经理:

ID, Editrights, deleterights 
2, 0, 1 
4, 1, 1 
5, 0, 0 

我想显示一个选择是这样的:

1, tom, 2 flat, no rights 
2, dan, 3 flat, Delete 
3, ben, 4 flat, no rights 
4, bob, 6 flat, Edit&Delete 
5, sam, 9 flat, no rights 

任何帮助将是巨大的

+0

参见:http://stackoverflow.com/questions/532694/sql-select-rows-from-two-different-tables,http://stackoverflow.com/questions/231126/mysql-get -information-from-multiple-tables-in-one-query,http://stackoverflow.com/questions/1363555/help-building-a-sql-query-from-multiple-tables,http://stackoverflow.com/questions/693327/sql-how-to-join-multiple-tables,http://stackoverflow.com/questions/2485210/mysql-need-help-constructing-query-join-multiple-tables-into-single-row – outis 2010-05-05 22:23:10

+0

如果您收到满意的答复,则应将其标记为正确。 – ABach 2010-05-07 14:12:20

回答

1

你想要的是左连接

5
SELECT * FROM members LEFT OUTER JOIN managers ON member.id = manager.id 

我不会推荐串联权利列到像“无权利”的字符串 - 这是更好的东西留给演示你的应用程序的一面。以原生形式返回尽可能多的数据,以便稍后可以更轻松地使用它。

+1

已更新以充分利用@Andrew的洞察力:无论是否在管理器表中有条目,您都需要使用LEFT OUTER JOIN来获取所有成员。 – ABach 2010-05-05 22:05:18

1

我认为这更接近你所要求的。 OUTER项是让您的成员不在Managers表中的内容。 CASE .. +东西可能需要进行一些调整才能处理您使用的任何数据库,但您的想法是 - 如果可以,@ABach在您的演示代码中处理此问题是正确的。

SELECT m.ID, m.Name, m.Address, 
CASE WHERE g.EditRights IS NULL AND g.deleterights IS NULL THEN 'no rights' 
ELSE 
    CASE WHERE g.Editrights = 1 THEN 'Edit' END 
    + CASE WHERE g.Editrights = 1 AND g.deleterights = 1 THEN '&' END 
    + CASE WHERE g.deleterights = 1 THEN 'Delete' END 
END AS rights 
FROM Members AS m 
LEFT OUTER JOIN Managers AS g ON g.ID = m.ID