复杂的MySQL数据结构/操作问题

Jas*_*son 5 mysql database-design stored-procedures data-manipulation

首先,我为长度道歉.这有点复杂(至少对我而言).

数据库背景:

我有产品,变量和价格表."产品"是关于产品(描述,标题等)的主要信息."价格"包含每个价格的信息(价格,成本,所需的最低数量,运输成本等),因为一些产品可以有多个价格(例如,10"小部件的价格与12"小部件的价格不同) ."变量"是产品的变化,不会改变价格,例如颜色,尺寸等.

最初(当我大约7年前建立这个数据库时)我将第一个价格中存储的变量信息存储在管道分隔格式的同一产品的价格列表中(是的,我知道,badbadbad).这一般起作用,但我们总是遇到一个问题,有时变量在所有价格中都不一致.

例如,Widget(产品)可以是10"或12"并且分别以10美元和20美元(价格)出售.然而,虽然10"小部件可能有蓝色和红色(变量),但12"小部件仅以红色显示.我们通过在不一致的变量中添加一个小的括号声明来改善这个问题,例如"Red(10"ONLY)".这种工作,但客户并不总是那么聪明,并且当客户选择时,很多时间用于修复错误红色的12英寸小部件.

从那以后,我一直负责对数据库进行现代化改造,并决定将变量放在自己的表中,使它们更具动态性,更容易与某些价格相匹配,并保留更多防伪库存(你无法想象噩梦).

我的第一步是在我的测试数据库上编写一个存储过程(当我进行转换时)将所有现有变量处理成一个新的变量表(和标签表,但这并不重要,我不认为).我有效地解析了变量,并使用正确的产品ID和它们最初在变量表中关联的产品ID列出它们.但是,我意识到这只是问题的一部分,因为我(至少对于数据库的初始转换)希望将每个变量列为连接到给定产品的每个价格.

为此,我创建了另一个表,如下所示:

tblvariablesprices
variablepriceid | variableid | priceid | productid

这是变量表的多对多.

问题:

我现在的问题是,我不知道如何创建行.我可以在我的价格和变量表上创建一个左连接来获取(我认为)所有必要的数据,我只是不知道如何通过它.我的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
Run Code Online (Sandbox Code Playgroud)

这将获得每个priceid和productid以及任何匹配的变量和标签ID.在某些情况下这很好,比如我有类似的东西:

priceid | productid | variableid | labelid
2       | 7         | 10         | 4
2       | 7         | 11         | 4
2       | 7         | 12         | 4
3       | 7         | (null)     | (null) --- another price for product

因为现在我知道我需要为priceid 2和变量10,11,12创建一个记录,然后为该产品创建priceid 3.但是,我也从这个数据集得到没有变量的产品,具有一个价格和多个变量的产品,以及具有多个价格且没有变量的产品的结果,例如:

priceid | productid | variableid | labelid
2       | 7         | 10         | 4
2       | 7         | 11         | 4
2       | 7         | 12         | 4
3       | 7         | (null)     | (null)
4       | 8         | (null)     | (null) --- 1 price no variables
5       | 9         | 13         | 5      --- mult vars, 1 price
5       | 9         | 14         | 5
5       | 9         | 15         | 6
5       | 9         | 16         | 6
6       | 10        | (null)     | (null) --- mult price, no vars
7       | 10        | (null)     | (null)
8       | 10        | (null)     | (null)

采用上面的数据集,我想在我的tblpricesvariables表中添加条目,如下所示:

variablepriceid | variableid | priceid | productid
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?我也欢迎任何关于如何更好地组织和/或构建这些数据的意见.

非常感谢您阅读所有这些并帮助我.

chr*_*ris 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 |
+------------+---------+-----------+
Run Code Online (Sandbox Code Playgroud)

插入 tblvariables 留给读者作为练习;)