4

長い説明を避けるために一番下にスキップしてください

わかりました。

私はクライアントの仕事を管理するために会社のイントラネットに取り組んでいます。ジョブは要素で構成されています。要素の例としては、「6 ページの Web サイトを構築する」や「ロゴをデザインする」などがあります。

各要素は役割時間のコレクションで構成されているため、「6 ページの Web サイトを構築する」には、4 時間の「開発者」料金と 2 時間の「デザイナー」料金が含まれる場合があります (わかりました、もう少し長くなるかもしれません :)

明らかに、異なるクライアントは異なる時間料金を取得します。そして、それはすでにシステムで考慮されていますが、十分な柔軟性が得られていません。伝統的に、私たちのアカウント マネージャーは、どちらかというと... その場しのぎの価格設定でした: 「6 ページの Web サイトを構築する」要素には、クライアント「ボブ」の場合、標準の 4 時間の開発者が含まれる場合がありますが、クライアントの場合は 8 時間です。ハリー」。

我慢してください。すぐに実際のコードに取り掛かります。

もちろん、要素は「Elements」データベース テーブルに保存されます。このテーブルは、ID とテキスト ラベルだけで構成されています。

「クライアント固有の要素が必要」という問題に対する私の進行中の解決策は、このテーブルに「クライアント」フィールドを追加することです。次に、利用可能な要素のクライアント固有のバージョンを確認して追加し、好みに合わせて調整します。

アカウント マネージャーが自分のジョブに要素を追加する場合、(a) 誰でも利用できる要素、つまりクライアント フィールドが NULL である要素、または (b) ジョブ クライアントに固有の要素のみを表示する必要があります。

これまでのところ、SELECT WHERE.

しかし、それはそれをカットするつもりはありません。ハリー専用の 2 つ目の「6 ページの Web サイトを構築する」要素を追加すると、ハリーのジョブに要素を追加するアカウント マネージャーには、要素の標準バージョンとハリーのバージョンの両方が表示されます。これはダメです。該当するクライアント固有のバージョンがない場合は、標準バージョンのみが表示されます。

わかりました... すっごく: 「クライアント」フィールドを要素テーブルに追加するだけでなく、「親要素」フィールドを追加します。次に、テーブルをそれ自体に結合することを含む魔法のような自己参照を行い、関連するロールのみを取得できます。

したがって、私の待望の質問は次のとおりです。

ほら、実際の質問

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 に答える