4

在这种情况下,我有三个主表:类别、板和权限。类别和板表是不言自明的。权限表包含的行将确定用户是否被允许阅读板内的线程、在板内创建线程、回复板内的线程,或管理板内的线程和帖子。在表中,用户对每个操作的能力由 0(关闭,或假)或 1(打开,或真)表示。这些基于用户所属的成员组。

我想做的是创建一个选择类别的查询。它应该只选择具有用户可以阅读的板的类别。基本上,如果一个类别没有用户可以阅读的任何板,则不会被选中。如果该类别甚至只有一个用户可以阅读的板,它将被选中。

下一个查询是选择用户可以阅读的特定类别中的板。基于与上述相同的原则。显示一个用户无法阅读的板子,以便在他们已经单击链接后才能找到它的意义何在?

我从来没有真正自己创建过这样复杂的查询,所以我什至不知道从哪里开始。如果您能帮助我,我将不胜感激。

更新

所以,我决定试一试,这就是我想出的:

$查询 = "
            选择
                b.category_id,b.board_id,b.position,
                p.group_id、p.board_id、p.read
            FROM forum_boards AS b
                INNER JOIN forum_permissions AS p ON (
                        p.board_id = b.board_id,
                        p.group_id = 1,
                        p.read = 1
                )
            WHERE b.category_id = ".$category_id."
            按 b.position 排序";

请注意,这是获取用户可以阅读的特定类别中的板的查询。它目前正在返回下面的错误,我不知道为什么。

操作数应包含 1 列

类别表 板表 权限表

4

2 回答 2

5

由于Niko已经提供了使用连接的示例查询,所以我提供了subquery版本,以便与已经提供的答案有所不同

第一个子查询是您要求的我想做的是创建一个选择类别的查询。它应该只选择具有用户可以阅读的板的类别。基本上,如果一个类别没有用户可以阅读的任何板,则不会被选中。如果该类别甚至只有一个用户可以阅读的板

我已经添加了status=1forum_boards处于活动状态的条件,我只是输入了,group_id=1所以您必须提供正确的用户组 ID

SELECT * FROM forum_categories WHERE category_id IN (
SELECT category_id FROM forum_boards WHERE `status`=1 AND board_id IN (
SELECT board_id FROM forum_permissions WHERE group_id=1 AND `read`=1) )

这是您要求相同要求的第二个查询,但这次选择板但在一个类别内,我再次status=1根据您的需要添加了条件集,我不知道category_id所以我只是把它放在category_id=1你必须注意的地方其中放置正确的类别ID

SELECT *  FROM forum_boards WHERE `status`=1 AND board_id IN (
SELECT board_id FROM forum_permissions WHERE group_id=1 AND `read`=1) AND category_id=1

希望有意义

于 2013-06-28T20:01:43.853 回答
3

这个问题听起来很复杂,但实际上并非如此。您可以根据给定的组 ID 选择所有类别,方法是从“权限”中选择并根据给定的 board_id 加入“boards”,然后根据 board 的 category_id 进一步加入“categories”。这将返回每个类别,因为它在“权限”中间接列出。为避免这种情况,您通常按类别 ID 进行分组,以便每个不同的类别仅包含在结果集中一次。要排除没有可读板的类别,您现在通过“权限”表仅选择那些板:

SELECT c.*
FROM permissions AS p
JOIN boards AS b ON b.board_id = p.board_id
JOIN categories AS c ON c.category_id = b.category_id
WHERE p.group_id = 100 AND p.can_read = 1
GROUP BY c.category_id

在此示例中,我已将您的列“read”重命名为“can_read”。请参阅此小提琴的演示:http ://sqlfiddle.com/#!2/07e74/1

对于“特定类别的板”,整个事情甚至更简单,因为您不需要按任何东西分组 - 只需将“权限”与“板”连接并应用限制:

SELECT b.*
FROM permissions AS p
JOIN boards AS b ON b.board_id = p.board_id
WHERE p.group_id = 100 AND p.can_read = 1 AND b.category_id = 1

演示:http ://sqlfiddle.com/#!2/07e74/2

于 2013-06-23T09:32:48.567 回答