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

时间:2011-02-10 19:59:43

标签: 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

这将为我提供每一个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?我也欢迎任何关于如何更好地组织和/或构建这些数据的意见。

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

2 个答案:

答案 0 :(得分: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是留给读者的练习;)

答案 1 :(得分:1)

我认为这应该有效:

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

下次,您可以使用create和insert语句来复制您的设置吗?感谢。