【问题标题】:Complicated MySQL Data Structure/Manipulation Problem复杂的 MySQL 数据结构/操作问题
【发布时间】:2011-06-25 02:55:52
【问题描述】:

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

数据库背景:

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

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

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

【问题讨论】:

    标签: mysql database-design stored-procedures data-manipulation


    【解决方案1】:

    我认为这应该可行:

    选择 v.variableid、p.productid、p.priceid FROM tblvariables v, tblprices p WHERE v.priceid IN(选择 s.priceid FROM tblprices WHERE s.productid = p.productid);

    下一次,您可以添加创建和插入语句来复制您的设置吗?谢谢。

    【讨论】:

    • 是的,CREATE 和 INSERT 确实会节省一些时间
    • 非常感谢院长......这也是一个合适的解决方案(获取正确的数据),但克里斯的执行大约需要 7 秒,而您的大约需要 1-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 留给读者作为练习 ;)

    【讨论】:

    • 天哪。这正是我所需要的(当然还有一些小的补充)。哇老兄。哇。
    • 欢迎您。下一次虽然请听从 Dean 的建议,添加 CREATE 和 INSERT 语句,这样可以节省大量复制数据库结构的时间。
    • 啊,好的,我明白你在说什么。对不起。谢谢你把我看似巨大的问题(对我来说),让它看起来像是儿戏。天哪
    猜你喜欢
    • 2017-04-18
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    相关资源
    最近更新 更多