我遇到的情况是,我的客户通过电子邮件向我发送了一个excel文件,其中有50列数据非常规范化。然后我将其导出为CSV并上传到MySQL - 单表。这些列用于不同的成分(每个成分的10列数据 - 标题,类别等),然后是40种不同的列,用于每种成分的特征。因此,表中的每种成分都包含所有这50个色谱柱,即使每个色谱柱都不适用于该成分。
我的问题是,我是否可以创建一个SQL,只为一个选定的成分选择填充的特征并省略所有其他列?
(我知道另一个选择是建立我自己的CSV解析器,创建多个表,然后为他们编写SQL,但我想调查解决这个问题。如果那是不可能的那么我只需面对那个并构建一个解析器; P)
这是我来的,但这并没有完全排除未填写的列(或包含“nei”。
SELECT
IF(`Heving-vanlig-gjaerbakst` <> '' AND `Heving-vanlig-gjaerbakst` <> 'nei', `Heving-vanlig-gjaerbakst`, 'random') AS `test1`,
IF(`Frys-kort` <> '' AND `Frys-kort` <> 'nei', `Frys-kort`, 'random') AS `test2`
... and for the 38 other rows ...
FROM x
WHERE id = 123
我宁愿不通过跳过空行= P
在PHP代码中解决这个问题示例行(首先是列名):
g1 gruppe ug1 undergruppe artnr artikkel beskrivelse status enhet ansvar prisliste Heving-vanlig-gjaerbakst Heving-soete-deiger Deig-stabilitet Smaksgiver Saftighet Krumme-poring Skorpe Volum Konservering Skjaerbarhet Frys-lang Frys-kort Kjoel Holdbarhet E-fri Azo-fri Mandler Aprikoskjerner Helmiks Halvmiks Base Konsentrat Utstrykning Bakefasthet Frukt-Baerinnhold Slippegenskaper Hindre-koksing Palmefri Fritering Smidighet Baking Kreming Roere Fylning Dekor Prefert Viskositet Cacaoinnhold Fet-innhold
100150 Bakehjelpemidler 100150200 Fiber/potetprodukter 10085 Potetflakes sekk 15 kg Egnet til lomper, lefser, brød og annet bakverk. B... Handel Sekk Trond Olsen JA xxx xxx xxx
正如您所看到的,大多数列都是空的。 X,XX和XXX是等级系统的一种形式,但对于某些列,内容是“是”或“否”。
正如我所说,前10列是关于该产品的信息,另外40列是不同的特征(这是我想为一种产品使用的那些)。
答案 0 :(得分:0)
听起来有点像你想把你的表转换成两个表:
CREATE TABLE Ingredients
(
g1 ...,
gruppe ...,
ug1 ...,
undergruppe ...,
artnr ... PRIMARY KEY,
artikkel ...,
beskrivelse ...,
status ...,
enhet ...,
ansvar ...,
prisliste ...
);
我已选择猜测artnr
是主键,但会对实际主键进行调整。此表包含所有成分共有的十一个(尽管您的问题是十个)列。然后你有另一个表包含:
CREATE TABLE IngredientProperties
(
artnr ... NOT NULL REFERENCES Ingredients,
property VARCHAR(32) NOT NULL,
value VARCHAR(3) NOT NULL,
PRIMARY KEY(artnr, property)
);
然后,您可以将原始表中的填充列加载到这两个列中。在最坏的情况下,在IngredientProperties中有40个条目用于成分中的一个条目。您可以制作&#39; property
&#39;到可能成分属性的定义列表的外键引用(第三个表定义属性的可能值 - 基本上是原始表中列名的记录)。如果添加第三个表,它可能在逻辑上称为IngredientProperties(也是),在这种情况下,我称为IngredientProperties的表需要重命名。
然后,您可以加入Ingredients和IngredientProperties以获取所需信息。
我不确定我是否推荐此解决方案;它基本上是使用&#39;实体属性值&#39;数据库设计方法。但是,对于您似乎拥有的非常稀疏的信息,以及与第三个表的约束一起使用时。
你可以理解的是处理40列的所有可能组合,因为这个数字随着列数呈指数增长(并且当N = 40时非常大)。