跳到底部以避免冗长的解释
好的,所以。
我正在为管理客户工作的公司 Intranet 工作。工作由元素组成:一个示例元素可能是“建立一个六页的网站”或“设计一个标志”。
每个元素都由一组角色时间组成,因此“建立一个六页的网站”可能包括四个小时的“开发人员”率和两个小时的“设计师”率(好吧,也许更长一点:)
显然,不同的客户得到不同的小时费率。而且,尽管系统中已经考虑到了这一点,但它并没有给我们足够的灵活性。传统上,我们的客户经理在定价方面相当...特别...哈利”。
忍受我。我很快就会得到实际的代码。
当然,元素存储在“元素”数据库表中——它仅由一个 ID 和一个文本标签组成。
对于“我们需要特定于客户的元素”问题,我正在进行的解决方案是在此表中添加一个“客户”字段。然后,我们可以检查并添加可用元素的任何特定于客户的版本,调整它们以适应口味。
当客户经理向他们的工作添加元素时,他们应该只看到 (a) 任何人都可以使用的元素 - 也就是说,他们有一个 NULL 客户字段,或者 (b) 特定于工作客户的元素。
到目前为止,选择 WHERE。
但这不会削减它。如果我专门为 Harry 添加第二个“构建六页网站”元素,那么为 Harry 添加元素到工作的客户经理将看到标准版本和 Harry 的元素版本。这不好。如果没有适用的客户特定版本,他们应该只看到标准版本。
好的... soooo:除了向元素表添加“客户端”字段外,还添加一个“父元素”字段。然后我们可以做一些神奇的自我引用,包括将表连接到自身,并只获取相关的角色。
因此,我期待已久的问题是:
哦,看,一个实际的问题
id label client parent_element
1 Standard Thing NULL NULL
2 Harrys Thing 1 1
3 Bobs Thing 2 1
4 Different Thing NULL NULL
鉴于此表结构,我如何编写一个接受“客户端 ID”参数并返回的 SQL 查询:
- 对于客户端 ID 1,第 2 行和第 4 行
- 对于客户端 ID 2,第 3 行和第 4 行
- 对于客户端 ID 42,第 1 行和第 4 行
对于额外的加分,结果应包括父元素标签。因此,对于客户端 ID 1,例如:
id label standardised_label client parent_element
2 Harrys Thing Standard Thing 1 1
4 Different Thing Different Thing NULL NULL