Php SQL仅将行中的非空列作为新行返回

Php SQL仅将行中的非空列作为新行返回,php,sql,select,if-statement,subquery,Php,Sql,Select,If Statement,Subquery,我遇到的情况是,我的客户通过电子邮件给我发送了一个excel文件,其中有50列数据极不规范。然后我将其导出到CSV并上传到MySQL-single表中。这些列是针对不同成分的,每种成分有10列数据——标题、类别等,然后是针对每种成分特征的40列数据。因此,表中的每种成分都有这50列,即使每列都不适用于该成分 我的问题是,我是否可以创建一个SQL,只选择一种选定成分的填充特征,而不选择所有其他列 我知道另一个选择是构建我自己的CSV解析器,创建多个表,然后为它们编写SQL,但我想先研究解决这个问题

我遇到的情况是,我的客户通过电子邮件给我发送了一个excel文件,其中有50列数据极不规范。然后我将其导出到CSV并上传到MySQL-single表中。这些列是针对不同成分的,每种成分有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
正如您所看到的,这里的大多数列都是空的。十、 XX和XXX是评分系统的一种形式,但对于某些栏目,内容改为是或否


正如我所说的,前10列是关于该产品的信息,其他40列是不同的特性,这是我想为一个给定产品使用的特性。

听起来有点像是要将现有的表转换为两个表:

CREATE TABLE Ingredients
(
    g1           ...,
    gruppe       ...,
    ug1          ...,
    undergruppe  ...,
    artnr        ... PRIMARY KEY,
    artikkel     ...,
    beskrivelse  ...,
    status       ...,
    enhet        ...,
    ansvar       ...,
    prisliste    ...
);
我选择猜测artnr是主键,但将后面的内容调整为实际的主键。这张表包含了11列,尽管你的问题提到了所有成分共有的10列。然后,您将拥有另一个表,其中包含:

CREATE TABLE IngredientProperties
(
    artnr       ... NOT NULL REFERENCES Ingredients,
    property    VARCHAR(32) NOT NULL,
    value       VARCHAR(3)  NOT NULL,
    PRIMARY KEY(artnr, property)
);
然后可以将原始表中填充的列加载到这两个表中。最糟糕的情况是,IngCreditProperties中有40个条目,而Component中有一个条目。您可以将“property”转换为对可能成分属性定义列表的外键引用,即定义属性可能值的第三个表,基本上是原始表中列名的记录。如果添加第三个表,它在逻辑上也可能被称为IngredientProperties,在这种情况下,需要重命名我称为IngredientProperties的表

然后,您可以加入配料和IngredientProperties以获得所需信息

我不确定我是否推荐这种解决方案;它基本上是使用“实体属性值”方法进行数据库设计。但是,对于您似乎拥有的极其稀疏的信息,以及与第三个表的约束一起使用时


您不能明智地处理40列的所有可能组合,因为该数字随列数呈指数增长,并且在N=40时相当大。

听起来有点像您想将现有的表转换为两个表:

CREATE TABLE Ingredients
(
    g1           ...,
    gruppe       ...,
    ug1          ...,
    undergruppe  ...,
    artnr        ... PRIMARY KEY,
    artikkel     ...,
    beskrivelse  ...,
    status       ...,
    enhet        ...,
    ansvar       ...,
    prisliste    ...
);
我选择猜测artnr是主键,但将后面的内容调整为实际的主键。这张表包含了11列,尽管你的问题提到了所有成分共有的10列。然后,您将拥有另一个表,其中包含:

CREATE TABLE IngredientProperties
(
    artnr       ... NOT NULL REFERENCES Ingredients,
    property    VARCHAR(32) NOT NULL,
    value       VARCHAR(3)  NOT NULL,
    PRIMARY KEY(artnr, property)
);
然后可以将原始表中填充的列加载到这两个表中。最糟糕的情况是,IngCreditProperties中有40个条目,而Component中有一个条目。您可以将“property”转换为对可能成分属性定义列表的外键引用,即定义属性可能值的第三个表,基本上是原始表中列名的记录。如果添加第三个表,它在逻辑上也可能被称为IngredientProperties,在这种情况下,需要重命名我称为IngredientProperties的表

然后,您可以加入配料和IngredientProperties以获得所需信息

我不确定我是否推荐这种解决方案;它基本上是使用“实体属性值”方法进行数据库设计。但是,对于您似乎拥有的极其稀疏的信息,以及与第三个表的约束一起使用时


你不能明智地处理40列的所有可能组合,因为这一数字随着列数呈指数增长,并且在N=40时相当大。

有什么方法可以对成分进行分类,知道应该应用哪些列吗?比如说,粘度,液体流动的“速度”,这可能不适用于面粉。这将改变为最终目的地设计数据库的方式。您可能可以在SQL端执行所有操作,但我建议您在导入表中添加一个自动增量键,否则该键应与传递的文件相同。是否有方法对成分进行分类,以知道应应用哪些列?比如说,粘度,液体流动的“速度”,这可能不适用于面粉。这将改变为最终目的地设计数据库的方式。你可能会
bly能够在SQL端完成所有工作,但我建议您在导入表中添加一个自动增量键,否则该键应该与传递的文件相同。答案写得很好,但目前在这个项目中规范化表是一个很大的禁忌。由于时间限制,我们不能构建多个表或任何自己的转换,我们必须使用excel数据,因为这是客户机处理其数据的形式。我们不能创建同样原因的管理界面。然而,我正努力将最后期限推迟1-2天,以便我们可以花一些时间构建自己的csv/excel上传程序。但这不是我们想要做的事情,除非我们确定构建一个可怕的杀手级SELECT-SQL是不可能的。答案写得很好,但目前在这个项目中,表的规范化是一个很大的禁忌。由于时间限制,我们不能构建多个表或任何自己的转换,我们必须使用excel数据,因为这是客户机处理其数据的形式。我们不能创建同样原因的管理界面。然而,我正努力将最后期限推迟1-2天,以便我们可以花一些时间构建自己的csv/excel上传程序。但这不是我们想要做的事情,除非我们确定构建一个可怕的杀手级SELECT-SQL是不可能的。