在这个场景中我有三个主表:类别、版 block 和权限。类别和板表是不言自明的。权限表包含的行将确定是否允许用户读取版 block 中的线程、创建版 block 中的线程、回复版 block 中的线程或管理版 block 中的线程和帖子。在表中,用户对每个操作的能力由 0(关,或假)或 1(开,或真)表示。这些基于用户所属的成员组。
我想做的是创建一个选择类别的查询。它应该只选择具有用户可以阅读的板的类别。基本上,如果一个类别没有任何用户可以阅读的版 block ,它就不会被选中。如果该类别甚至只有一个用户可以阅读的版 block ,则会被选中。
下一个查询是在特定类别中选择用户可以阅读的版 block 。基于与上述相同的原则。显示一个用户无法阅读的看板,只是为了让他们在点击链接后才能发现,这有什么意义?
我自己从来没有真正创建过这样复杂的查询,所以我什至不知道从哪里开始。如果您能帮助我,我将不胜感激。
更新
所以,我决定试一试,这就是我想出的:
$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";
请注意,这是获取用户可以阅读的特定类别中的版 block 的查询。目前正在返回以下错误,我不明白为什么。
Operand should contain 1 column(s)
最佳答案
因为 Niko 已经提供了使用连接的示例查询,所以我提供了 subquery
版本,以便与已经提供的答案有所不同
第一个子查询是您要求的我想做的是创建一个选择类别的查询。它应该只选择具有用户可以阅读的板的类别。基本上,如果一个类别没有任何用户可以阅读的版 block ,它就不会被选中。如果该类别甚至只有一个用户可以阅读的版 block
我已经添加了条件 status=1
你的 forum_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
希望有道理
关于php - 如何使用 MySQL Joins 选择允许用户阅读的论坛版 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17259122/