4

跳到底部以避免冗长的解释

好的,所以。

我正在为管理客户工作的公司 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
4

1 回答 1

3
SELECT  mm.*, md.label AS standardized_label
FROM    mytable md
LEFT JOIN
        mytable mc
ON      mc.parent_element = md.id
        AND mc.client = @client
JOIN    mytable mm
ON      mm.id = COALESCE(mc.id, md.id)
WHERE   md.client IS NULL

为此创建一个索引以(client, parent_element)使其快速工作。

请参阅SQLFiddle

于 2013-05-07T16:45:15.677 回答