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

Complicated MySQL Data Structure/Manipulation Problem

提问人:Jason 提问时间:2/11/2011 更新时间:2/11/2011 访问量:276

问:

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

数据库背景:

我有一个产品、变量和价格表。“产品”是有关产品的主要信息(描述、标题等)。“价格”包含有关每个价格的信息(价格、成本、所需的最小数量、运费等),因为某些产品可以有多个价格(例如,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 和 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

我有数千条记录要处理,所以显然手动执行此操作不是答案。谁能至少为我指出正确的方向,如果没有想出一个可以处理此类操作的 sproc?我也欢迎就如何更好地组织和/或构建这些数据发表任何意见。

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

MySQL 数据库设计 存储过程 数据操作

评论


答:

1赞 Dean 2/11/2011 #1

我认为这应该有效:

SELECT v.variableid, p.productid, p.priceid FROM tblvariables v, tblprices p WHERE v.priceid IN (选择 s.priceid 从tblprices s 其中 s.productid = p.productid);

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

评论

0赞 chris 2/11/2011
是的,CREATEs 和 INSERT 确实可以节省一些时间
0赞 Jason 2/11/2011
非常感谢院长...这也是一个合适的解决方案(获取正确的数据),但 Chris 的执行大约需要 7 秒,而您的大约需要 1-2 分钟。感谢您的帮助!
2赞 chris 2/11/2011 #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 |
+------------+---------+-----------+

INSERTing into tblvariables 留给读者作为练习;)

评论

0赞 Jason 2/11/2011
天哪。这正是我需要的(当然,还有一些小的补充)。哇,伙计。哇。
0赞 chris 2/11/2011
您的欢迎。下次请遵循 Dean 的建议并添加 CREATE 和 INSERT 语句,这样可以节省大量重现数据库结构的时间。
0赞 Jason 2/11/2011
啊,好吧,我明白你在说什么了。对不起。谢谢你把我看似巨大的问题(对我来说)并让它看起来像是儿戏。天