首先,对于篇幅,我深表歉意。这有点复杂(至少对我而言)。
数据库背景:
我有一个产品、变量和价格表。 “产品”是关于产品的主要信息(描述、标题等)。 “价格”包含有关每个价格的信息(价格、成本、所需的最低数量、运费等),因为某些产品可能有多个价格(例如,10 英寸的小部件与 12 英寸的小部件的价格不同) . “变量”是产品的变体,不会改变价格,例如颜色、尺寸等。
最初(当我大约 7 年前建立这个数据库时)我将变量信息以竖线分隔的格式存储在同一产品价格列表的第一个价格中(是的,我知道,badbadbad)。这通常有效,但我们总是遇到一个问题,有时变量在所有价格中并不一致。
例如,Widget(产品)可能是 10 英寸或 12 英寸,售价分别为 10 美元和 20 美元(价格)。然而,虽然 10"小部件可能有蓝色和红色(变量),但 12"小部件仅提供红色。我们通过在不一致的变量中添加一个小的括号语句来改善这个问题,例如“Red (10” ONLY)”。这种方法有效,但客户并不总是那么聪明,并且在客户选择时会花费大量时间来纠正错误一个 12 英寸的红色小部件。
从那以后,我的任务是对数据库进行现代化改造,并决定将变量放在它们自己的表中,使它们更具动态性,更容易与特定价格相匹配,并保留一个更可靠的库存(你可以不要想象那些噩梦)。
我的第一步是在我的测试数据库上编写一个存储过程(当我进行转换时)以将所有现有变量处理成一个新的变量表(和标签表,但这并不重要,我不思考)。我有效地解析了变量,并在变量表中列出了正确的产品 ID 和它们最初关联的产品 ID。然而,我意识到这只是问题的一部分,因为我(至少对于数据库的初始转换)希望每个变量都被列为与给定产品的每个价格相关联。
为此,我创建了另一个表,如下所示:
tblvariablesprices variablepriceid | variableid | priceid | productid
which is a many-to-many with the variable table.
Problems:
My problem now is, I don't know how to create the rows. I can create a left join on my prices and variables tables to get (I think) all the necessary data, I just don't know how to go through it. My sql is (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 和 variableids 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
我有数千条记录要处理,因此显然手动执行此操作不是解决问题的办法。如果没有想出可以处理此类操作的存储过程,至少有人能指出我正确的方向吗?我也欢迎就如何更好地组织和/或构造这些数据提出任何意见。
非常感谢您阅读所有这些内容并帮助我。
最佳答案
怎么样:
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 |
+------------+---------+-----------+
INSERTing into tblvariables 留给读者做练习 ;)
关于mysql - 复杂的MySQL数据结构/操作问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4961989/