如何使用MySQL联接选择允许用户阅读的论坛板?

Sho*_*291 4 php mysql join greatest-n-per-group

在这种情况下,我有三个主表:类别,板和权限.类别和董事会表格非常明显.权限表包含的行将确定是否允许用户读取板内的线程,在板内创建线程,回复板内的线程,或者调整板内的线程和帖子.在表中,用户对每个操作的能力由0(关闭或假)或1(开启或真实)指示.这些基于用户所属的成员组.

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

下一个查询是选择用户可以读取的特定类别中的板.基于与上述相同的原则.显示一个用户无法阅读的电路板有什么意义,让他们在点击链接后找到它?

我自己从未真正创建过这样复杂的查询,所以我甚至不知道从哪里开始.如果你能帮帮我,我真的很感激.

更新

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

$query = "
            SELECT
                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."
            ORDER BY b.position";

请注意,这是用于获取用户可以阅读的特定类别内的板的查询.它目前正在返回以下错误,我无法弄清楚原因.

Operand should contain 1 column(s)

分类表 板表 权限表

M K*_*aid 5

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

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

我已添加了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) )
Run Code Online (Sandbox Code Playgroud)

这是你要求相同要求的第二个查询,但是这次选择板子但是在一个类别中,我再次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
Run Code Online (Sandbox Code Playgroud)

希望它有意义