5

首先,我为篇幅道歉。这有点复杂(至少对我来说)。

数据库背景:

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

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

例如,一个小部件(产品)可能是 10 英寸或 12 英寸,分别以 10 美元和 20 美元(价格)出售。但是,虽然 10" 小部件可能有蓝色和红色(变量),但 12" 小部件仅提供红色。我们通过在不一致的变量中添加一个小括号语句来改善这个问题,比如“红色(10”只)“。这种工作,但客户并不总是那么聪明,当客户选择时,很多时间都花在修复错误上一个 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 | 标签
2 | 7 | 10 | 4
2 | 7 | 11 | 4
2 | 7 | 12 | 4
3 | 7 | (空) | (null) --- 产品的另一个价格

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

价格| 产品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

我有数千条记录要处理,所以显然手动执行此操作不是答案。如果没有想出一个可以处理此类操作的存储程序,任何人至少可以为我指出正确的方向吗?我也欢迎任何关于如何更好地组织和/或构造这些数据的评论。

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

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 留给读者作为练习;)

于 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 回答