2010-12-08 9 views
0

私はterm DBを持っています。各用語はプライベートでもパブリックでもよい。
用語はprojectに編成されています。
userテーブルもあります。選択しているプロジェクトに依存する公開プライベートレコードのSQL

それは次のようになり、私は公共の状況の世話をしてデータを取得するためにSQLを作ることだったと私は公共許可する必要があるかどうかを事前に知っていれば:

SELECT * FROM term
JOIN project ON (project.id = term.id_project)
WHERE term.public = true
WHERE publicだったかもしれないが、このような明確)

または

WHERE (term.public = true OR term.public = false)(完全にスキップされますが、このような明確にされている可能性)

しかし、各ユーザー・プロジェクトの組み合わせ(user_project_mm)は、プライベートプロジェクトを表示することを許可または拒否できます。

SELECT * FROM term
JOIN project ON (project.id = term.id_project)
JOIN user_project_mm ON (user_project_mm.id_project = project.id)
WHERE user_project_mm.id_user = $currentUserID
[[IF user_project_mm.private THEN NOTHING ELSE AND term.public = true]]

[[]]内のコードは明らかにSQLではありません。すぐに解決しようとするようなものを生み出します。これはここで必要なSQL書き換えの一種です。 AND term.publicを付加するかどうかの決定は、それぞれの特定の結果レコードフィールドuser_project_mm.privateに依存します。

私はPHPで後処理したくないのですが、これはLIMITで行われたページネーションを台無しにしてしまい、とにかく汚いからです。このためのクリーンなSQLソリューションはありますか?私はそれを十分に明確に説明しましたか?

+0

が、私はそれがuser_project_mm.privateフィールドに$ CurrentUserにのために許可されています場合には(民間を含む)すべてのレコードを選択します。 私は、user_project_mm.privateフィールドにfalseを持つプロジェクトの公開レコードのみを選択します。 – Slawa

答えて

3
SELECT * FROM term 
JOIN project ON (project.id = term.id_project) 
JOIN user_project_mm ON (user_project_mm.id_project = project.id) 
WHERE user_project_mm.id_user = $currentUserID 
AND (user_project_mm.private = true or term.public = true) 
+0

そうですね!すぐに私の研究結果を報告しようとします。 – Slawa

0

@JackPDouglasは非常に良いアイデアを持っていて、とても簡単です!最終結果は次のようになります。

AND (user_project_mm.private OR (!user_project_mm.private AND term.public))

+0

'X OR(NOT X AND Y)'は 'X OR Y'よりも明瞭ではないと言いたい。 –

関連する問題