0

我有一个term数据库。每个术语可能是私有的或公共的。
术语被组织成projects。
还有一张user桌子。

如果我要创建一个 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 解决方案?我解释得够清楚了吗?

4

2 回答 2

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)
于 2010-12-08T14:38:43.143 回答
0

@JackPDouglas 有一个非常好的主意,而且非常简单!最终结果如下所示:

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

于 2010-12-09T09:51:09.710 回答