5

初めまして、長々と失礼いたしました。これはちょっと複雑です(少なくとも私にとっては)。

データベースの背景:

製品、変数、および価格のテーブルがあります。「製品」とは、製品に関する主要な情報 (説明、タイトルなど) です。「価格」には、各価格に関する情報 (価格、コスト、必要な最小数量、送料など) があります。一部の製品には複数の価格が設定されている場合があります (たとえば、10 インチのウィジェットは 12 インチのウィジェットとは異なる価格です)。 . 「可変」とは、色、サイズなど、価格が変わらない製品のバリエーションです。

当初 (約 7 年前にこのデータベースを構築したとき)、同じ製品の価格リストの最初の価格に変数情報をパイプで区切られた形式で格納していました (はい、わかっています、badbadbad)。これは一般的に機能しましたが、変数がすべての価格で一貫していない場合があるという問題が常にありました。

たとえば、ウィジェット (製品) は 10 インチまたは 12 インチで、それぞれ 10 ドルと 20 ドル (価格) で販売されます。ただし、10 インチのウィジェットは青と赤 (変数) で使用できる場合がありますが、12 インチのウィジェットは赤でのみ使用できます。「Red (10" ONLY)」のように、不適合な変数に括弧付きのステートメントを少し追加することで、この問題を改善しました。この種の機能は機能しますが、顧客は常にそれほど賢くはなく、顧客が選択したときに間違いを修正するために多くの時間が費やされます。赤の 12 インチのウィジェット。

それ以来、私はデータベースの最新化を任されており、変数を独自のテーブルに配置し、変数をより動的にして特定の価格との一致を容易にし、ダミープルーフの在庫を維持することにしました (悪夢)。

私の最初のステップは、既存のすべての変数を新しい変数テーブル (およびラベル テーブルですが、それほど重要ではないと思います) に処理するために、(変換を行うときのために) テスト データベースにストアド プロシージャを記述することでした。変数を効果的に解析し、正しい製品 ID と変数テーブルで最初に関連付けられた製品 ID をリストにしました。ただし、(少なくともデータベースの最初の変換では) 各変数を特定の製品の各価格に関連付けてリストする必要があるため、これは問題の一部にすぎないことに気付きました。

これを行うために、次のように別のテーブルを作成しました。

tbl変数価格
変数価格ID | 変数 ID | 価格 | 製品番号

これは、変数テーブルを使用した多対多です。

問題:

私の問題は、行を作成する方法がわからないことです。価格表と変数表に左結合を作成して、必要なすべてのデータを取得できます (と思います)。その方法がわかりません。私のSQLは(mysql 5.0)です:

SELECT p.priceid, p.productid, variableid, labelid 
FROM tblprices p 
LEFT JOIN tblvariables v ON p.priceid = v.priceid 
ORDER BY productid, priceid

これにより、すべての priceid と productid、および一致する変数とラベル ID が取得されます。これは、次のような場合など、特定の場合に適しています。

価格 | 製品 ID | 変数 ID | ラベルID
2 | 7 | 10 | 4
2 | 7 | 11 | 4
2 | 7 | 12 | 4
3 | 7 | (ヌル) | (null) --- 商品の別価格

これで、priceid 2 と variableids 10、11、12、およびその製品の priceid 3 のレコードを作成する必要があることがわかったからです。ただし、変数のない製品、1 つの価格で複数の変数を持つ製品、および複数の価格で変数のない製品についても、このデータセットから結果を取得します。たとえば、次のようになります。

価格 | 製品 ID | 変数 ID | ラベルID
2 | 7 | 10 | 4
2 | 7 | 11 | 4
2 | 7 | 12 | 4
3 | 7 | (ヌル) | (ヌル)
4 | 8 | (ヌル) | (null) --- 1 価格 変数なし
5 | 9 | 13 | 5 --- 多変数、1 価格
5 | 9 | 14 | 5
5 | 9 | 15 | 6
5 | 9 | 16 | 6
6 | 10 | (ヌル) | (null) --- マルチプライス、変数なし
7 | 10 | (ヌル) | (ヌル)
8 | 10 | (ヌル) | (ヌル)

上記のデータセットを使用して、次のように tblpricesvariables テーブルにエントリを追加します。

変数価格ID | 変数 ID | 価格 | 製品番号
1 | 10 | 2 | 7
2 | 11 | 2 | 7
3 | 12 | 2 | 7
4 | 10 | 3 | 7
5 | 11 | 3 | 7
6 | 12 | 3 | 7
7 | 13 | 5 | 9
8 | 14 | 5 | 9
9 | 15 | 5 | 9
10 | 16 | 5 | 9

処理するレコードが何千もあるため、明らかにこれを手動で行うことは答えではありません。このタイプの操作を処理できる sproc を考え出さなければ、誰かが少なくとも私を正しい方向に向けることができますか? また、このデータをより適切に整理および/または構造化する方法についてのコメントも歓迎します。

これをすべて読んで、私を助けてくれてありがとう。

4

2 に答える 2

2

どうですか:

SELECT DISTINCT b.variableid, a.priceid, a.productid
FROM tblprices AS a
JOIN tblprices AS b ON a.productid = b.productid
WHERE b.labelid IS NOT NULL
ORDER BY priceid;

+------------+---------+-----------+
| variableid | priceid | productid |
+------------+---------+-----------+
|         10 |       2 |         7 |
|         11 |       2 |         7 |
|         12 |       2 |         7 |
|         10 |       3 |         7 |
|         11 |       3 |         7 |
|         12 |       3 |         7 |
|         13 |       5 |         9 |
|         14 |       5 |         9 |
|         15 |       5 |         9 |
|         16 |       5 |         9 |
+------------+---------+-----------+

tblvariables への INSERT は、読者の演習として残されています ;)

于 2011-02-10T20:50:12.067 に答える
1

私はこれがうまくいくと思います:

SELECT v.variableid, p.productid, p.priceid FROM tblvariables v, tblprices p WHERE v.priceid IN (SELECT s.priceid FROM tblprices s WHERE s.productid = p.productid);

次回は、create ステートメントと insert ステートメントを挿入して、セットアップを複製できますか? ありがとう。

于 2011-02-10T20:41:54.020 に答える