【问题标题】:SQL for public private records which depend on the project being selected取决于所选项目的公共私人记录的 SQL
【发布时间】:2011-05-22 06:33:43
【问题描述】:

我有一个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 解决方案?我解释得够清楚了吗?

【问题讨论】:

  • 如果 user_project_mm.private 字段中的 $currentUser 允许,我想选择所有记录(包括私有记录)。我只想为那些在 user_project_mm.private 字段中为 false 的项目选择公共记录。

标签: sql postgresql join rights


【解决方案1】:
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)

【讨论】:

  • 好像是这样!我会尽快报告我的发现。
【解决方案2】:

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

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

【讨论】:

  • 我会说X OR (NOT X AND Y) 不如X OR Y 清晰(除非X 可以是NULL - 可以吗?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-11
  • 2014-07-14
  • 2016-05-30
  • 1970-01-01
相关资源
最近更新 更多