Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
复杂的MySQL数据结构/操作问题_Mysql_Database Design_Stored Procedures_Data Manipulation - Fatal编程技术网

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

复杂的MySQL数据结构/操作问题,mysql,database-design,stored-procedures,data-manipulation,Mysql,Database Design,Stored Procedures,Data Manipulation,首先,我很抱歉这么长时间。这有点复杂(至少对我来说) 数据库背景: 我有一个产品、变量和价格表。“产品”是关于产品的主要信息(描述、标题等)。“价格”包含关于每个价格的信息(价格、成本、所需的最小数量、运输成本等),因为有些产品可能有多个价格(例如,10”小部件的价格与12”小部件的价格不同)。“变量”是指不改变价格的产品变体,如颜色、尺寸等 最初(大约7年前我建立这个数据库时),我将变量信息以管道分隔格式存储在同一产品的价格列表的第一个价格中(是的,我知道,badbad)。这在一般情况下是有效

首先,我很抱歉这么长时间。这有点复杂(至少对我来说)

数据库背景:

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

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

例如,一个小部件(产品)可能是10英寸或12英寸,售价分别为10美元和20美元(价格)。然而,虽然10英寸小部件可能有蓝色和红色(变量),但12英寸小部件只有红色。我们通过在不一致的变量中添加一个小的插入语句(如“Red(10)”)来改善这个问题。这种方法很有效,但客户并不总是那么聪明,当客户选择一个红色的12”小部件时,会花费大量时间来纠正错误

此后,我一直负责数据库的现代化,并决定将变量放在自己的表中,使其更具动态性,更容易与特定价格匹配,同时保持一个更具虚拟性的库存(你无法想象噩梦)

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

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

tblvariablesprices variablepriceid | variableid | priceid | productid 这将获得每个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 | productid | variableid | labelid 2 | 7 | 10 | 4 2 | 7 | 11 | 4 2 | 7 | 12 | 4 3 | 7 |(空)|(空)——产品的另一个价格 因为现在我知道我需要为该产品的priceid 2和VariableID 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) priceid | productid | variableid | labelid 2 | 7 | 10 | 4 2 | 7 | 11 | 4 2 | 7 | 12 | 4 3 | 7 |(空)|(空) 4 | 8 |(null)|(null)---1价格无变量 5 | 9 | 13 | 5--多辆车,1个价格 5 | 9 | 14 | 5 5 | 9 | 15 | 6 5 | 9 | 16 | 6 6 | 10 |(空)|(空)--多价格,无VAR 7 | 10 |(空)|(空) 8 | 10 |(空)|(空) 利用上述数据集,我想向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 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 我有数千条记录要处理,所以显然手动操作不是解决办法。如果没有人能想出一个可以处理这类操作的程序,至少有人能给我指出正确的方向吗?我也欢迎大家就如何更好地组织和/或构建这些数据发表意见


非常感谢您阅读所有这些内容并帮助我解决问题。

我认为这应该有用:

选择v.variableid、p.productid、p.priceid 从TBL变量v,TBL价格p 其中v.priceid(选择s.priceid 从tblprices s 其中s.productid=p.productid)

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

那么:

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 |
+------------+---------+-----------+

插入TBL变量留给读者作为练习;)

是的,创建和插入确实可以节省一些时间。非常感谢dean。。。这也是一个合适的解决方案(获得正确的数据),但chris的解决方案大约需要7秒来执行,而您的解决方案大约需要1-2分钟。谢谢你的帮助!天哪。这正是我所需要的(当然还有一些小的补充)。哇,老兄。哇,不客气。不过下次请按照Dean的建议添加CREATE和INSERT语句,这样可以节省大量的时间来复制数据库结构。啊,好的,我明白你的意思了。我很抱歉。谢谢你把我看似巨大的问题(给我)拿出来,让它看起来像是孩子们的游戏。天哪
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 |
+------------+---------+-----------+