4

このシナリオには、カテゴリ、ボード、権限という 3 つの主要なテーブルがあります。カテゴリとボードのテーブルは一目瞭然です。許可テーブルには、ボード内のスレッドの読み取り、ボード内のスレッドの作成、ボード内のスレッドへの返信、またはボード内のスレッドと投稿のモデレートのいずれかをユーザーに許可するかどうかを決定する行が含まれています。表では、各アクションに対するユーザーの能力は、0 (オフ、または false) または 1 (オン、または true) で示されます。これらは、ユーザーが所属するメンバー グループに基づいています。

私がやりたいのは、カテゴリを選択するクエリを作成することです。ユーザーが読むことができるボードを持つカテゴリのみを選択する必要があります。基本的に、ユーザーが読めるボードがないカテゴリは選択されません。ユーザーが読めるボードが 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."
            ORDER BY b.position";

これは、ユーザーが読み取ることができる特定のカテゴリ内のボードを取得するためのクエリであることに注意してください。現在、以下のエラーが返されていますが、その理由はわかりません。

オペランドには 1 列を含める必要があります

カテゴリー表 ボード表 権限表

4

2 に答える 2

3

この問題は複雑に聞こえますが、実際にはそうではありません。「permissions」から選択し、指定された board_id に基づいて「boards」に参加し、さらにボードの category_id に基づいて「categories」に参加することにより、特定のグループ ID に基づいてすべてのカテゴリを選択できます。これにより、「権限」に間接的にリストされているのと同じ頻度で各カテゴリが返されます。これを避けるために、通常はカテゴリ ID でグループ化して、それぞれの異なるカテゴリが結果セットに 1 回だけ含まれるようにします。読み取り可能なボードのないカテゴリを除外するには、「権限」テーブルを介してそれらのボードのみを選択します:

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 に答える