将组表和成员组关系表视为
CREATE TABLE group (
group_id int(11) not null auto_increment,
title varchar(50),
status ENUM('private', 'public'),
PRIMARY KEY(group_id)
);
CREATE TABLE group_map (
group_map_id int(11) not null auto_increment,
group_id int(11) REFERENCES group(group_id),
user_id int(11) REFERENCES user(user_id),
PRIMARY KEY(group_map_id)
);
现在在群组页面中,如何
显示内容1. Group is public
OR
2. user is member of that group (user_id comes from $_SESSION login,
and we check if the current group_id && user_id exists in group_map table).
答案 0 :(得分:1)
以下是检索用户1
可以访问的所有群组的列表的方法,以及群组名称:
SELECT g.group_id, g.name
FROM `group` g
LEFT JOIN group_map gm
ON gm.group_id = g.group_id
WHERE g.status = 'public'
OR gm.user_id = 1
这是另一种选择,使用UNION
。
(SELECT g.group_id, g.name
FROM `group` g
WHERE g.status = 'public')
UNION
(SELECT g.group_id, g.name
FROM `group` g
JOIN group_map gm
ON gm.group_id = g.group_id
WHERE gm.user_id = 1)
他们两个都是大小。
请注意group
表名周围的反引号,因为GROUP
是MySQL中的保留字。
答案 1 :(得分:1)
你应该试试这个......
SELECT g.*,gm.* FROM group g INNER JOIN group_map gm ON g.`group_id` = gm.`group_id`
答案 2 :(得分:0)
首先,如果我理解你想要什么,你就不需要第二个表。您可以使用Users表。
如果小组是私人的,我就这样做了
SELECT tblGroups.*, tblUsers.*
FROM `tblGroups`, `tblUsers`
WHERE tblGroups.id=tblUsers.group AND // here you put what you need to open //
否则小组就是公开的
SELECT tblGroups.*
FROM `tblGroups`
WHERE // here you put what you need to open //