我有一张桌子如下所示:
ID|Prototype_A|Prototype_B|Prototype_C|Prototype_D|
---------------------------------------------------
1 |Fast381A |Blue4812 | Green7181 | White4812 |
---------------------------------------------------
2 |Slow841C |Orange8312 | null | null |
---------------------------------------------------
3 |Plane281K | null | null | null |
---------------------------------------------------我需要查询来返回该ID.的所有非空原型。
是否有一种方法可以使用通配符来选择像select(Prototype_*)这样的所有列,还是应该以不同的格式设置我的表?
例如,有人教我这种结构是不好的做法:
ID|Prototypes|
---------------------------------------------------
1 |Fast381A,Blue4812,Green7181,White4812
---------------------------------------------------
2 |Slow841C,Orange8312
---------------------------------------------------
3 |Plane281K
---------------------------------------------------发布于 2016-09-04 19:26:07
SQL查询返回一组固定的列。如果要将非空值组合为单个列,我建议使用concat_ws()。
select id,
concat_ws(',', Prototype_A, Prototype_B, Prototype_C, Prototype_D)
from t;这将忽略NULL值。查询返回两列,一列是原型列表。
你的问题的答案是“是的”。您应该考虑更改数据结构。有多个列存储相同的东西,仅仅有一个索引来标识它们,这通常意味着您需要一个单独的表,每个id和每个原型都有一行。
编辑:
你想要一张这样的桌子
create table ModelPrototypes (
ModelProtypeId int primary key auto_increment,
ModelId int not null,
ProtoTypeChar char(1),
Prototype varchar(255)
);然后,您将使用如下的值填充它:
1 A Fast381A
1 B Blue4812
1 C Green7181
1 D White4812 我不确定是否真的需要PrototypeChar,但信息在您的表中。
发布于 2016-09-04 19:30:42
无法使用通配符选择列。
你能做的是:
将您的表设置为
ID, Prototype_type, Prototype_name然后使用GROUP_CONCAT
SELECT id, GROUP_CONCAT(Prototype_name SEPARATOR ',')
FROM table GROUP BY Prototype_name 发布于 2016-09-04 22:17:47
"Should I setup my table in a different format?"
是。您的桌子看起来可能如下:
ID Prototype_Code Prototype
------------------------------
1 A Fast381A
1 B Blue4812
1 C Green7181
1 D White4812
2 A Slow841C
2 B Orange8312
3 A Plane281K https://stackoverflow.com/questions/39320653
复制相似问题