MySQL在视图中将列结果拆分为动态列

MySQL在视图中将列结果拆分为动态列,mysql,views,Mysql,Views,我不确定单独使用MySQL是否可行,或者是否需要PHP或类似的工具。我试图生成的是一个视图,它取决于一个表中存在的信息量,以确定视图中显示了多少列 我有一个包含以下字段的组件表: CM_ID (The component ID) CM_CODE (A specific company assigned code) CM_DESCRIPTION (A brief description of the component) FORMAT_ID (A referenced FK) ITEM_ID (A

我不确定单独使用MySQL是否可行,或者是否需要PHP或类似的工具。我试图生成的是一个视图,它取决于一个表中存在的信息量,以确定视图中显示了多少列

我有一个包含以下字段的组件表:

CM_ID (The component ID)
CM_CODE (A specific company assigned code)
CM_DESCRIPTION (A brief description of the component)
FORMAT_ID (A referenced FK)
ITEM_ID (A referenced FK)
从组件表中选择的示例如下:

CM_ID   CM_CODE CM_DESCRIPTION      FORMAT_ID       ITEM_ID
1       111111  Technical Manual    1 (280 Page A4 Book)    32
2       111112  Schematic Diagram   2 (A3 Fold-out sheet)   32
3       222223  Technical Manual    1 (280 Page A4 Book)    2
4       222224  Price Guide         25 (32 Page A4 Book)    2
5       333335  Instruction Manual  33 (220 Page A5 Book)   44
我试图获取的视图是基于(从主项目表)显示项目的。每个项目将有一个或多个组件(随CM_ID上的FK一起引入)

我提出了以下观点:

SELECT  i.item AS Item,
GROUP_CONCAT(DISTINCT CONCAT(cm.CM_CODE, _utf8', ',cm.CM_DESCRIPTION, _utf8,', ',f.FORMAT_DESCRIPTION) SEPARATOR '; ') AS Components
FROM item AS i
JOIN components AS cm ON i.ITEM_ID = cm.ITEM_ID
JOIN format AS f ON cm.FORMAT_ID = f.FORMAT_ID
这将获得以下形式的结果:

Item    Components
2       222223, Technical Manual, 164 Page A4 Book; 222224, Price Guide, 32 Page A4 Book
32      111111, Technical Manual, 280 Page A4 Book; 111112, Schematic Diagram, A3 Fold-out
44      333335, Instruction Manual, 220 Page A5 Book
由于连接,仅返回2列(项和组件)。我希望能够为项目的组件形成单独的列,这些列取决于组件的实际数量

示例输出:

Item    Component1                                  Component2
2       222223, Technical Manual, 164 Page A4 Book  222224, Price Guide, 32 Page A4 Book
32      111111, Technical Manual, 280 Page A4 Book  111112, Schematic Diagram, A3 Fold-out Sheet
44      333335, Instruction Manual, 220 Page A5 Book
请注意,项目44只有一个组件,因此,组件2列中没有数据。如果只对第44项进行选择,那么理想情况下,根本不会提到Component2列。类似地,如果另一项附带4个组件,则输出将自动缩放以形成4个组件列

我已经研究了很多方法来实现这一点,但似乎没有一种方法是完全正确的。这可能吗

非常感谢

伊恩

更新**

好的,我正在尝试设置一个定义的列数,并对其进行选择,但仍然有困难。我在Components表中添加了另一个字段:

CM_ORDER
可用于区分相同项目的组件(理论上)

我知道这是不对的,但我正试图按照以下思路来做:

SELECT  i.item AS Item,
cm.CM_CODE AS Component_Code1 WHERE cm.CM_ORDER = 1,
cm.CM_DESCRIPTION AS Component_Description1 WHERE cm.CM_ORDER = 1,
cm.CM_CODE AS Component_Code2 WHERE cm.CM_ORDER = 2,
cm.CM_DESCRIPTION AS Component_Description2 WHERE cm.CM_ORDER = 2
FROM item AS i
JOIN components AS cm ON i.ITEM_ID = cm.ITEM_ID
JOIN format AS f ON cm.FORMAT_ID = f.FORMAT_ID
我也不知道如何在那里获得相关的“格式”信息。显然,MySQL对我在SELECT语句中放入多个WHERE子句一点也不满意,所以我尝试使用CASE代替,取得了同样的成功(无)

必须有一种方法可以在同一查询中将其拆分为单独的列,而无需使用脚本/编码语言

努力取得成果:

Item    Component_Code1    Component_Description1    Component_Code2    Component_Description2
2       222223             Technical Manual          222224             Price Guide
32      111111             Technical Manual          111112             Schematic Diagram
44      333335             Instruction Manual
  • 与相关的“格式”数据也
我希望这可以做到

干杯


严格地说,您想要做的事情在SQL中是不可能的。SQL要求查询中的列是预定义的

一种可能的方法是为此目的使用动态SQL。您将计算数据中组件的最大数量,然后使用此信息创建查询

您已经在尝试第二种方法,即使用逗号分隔列表的分号分隔列表


最后一种方法是确定组件的最大数量,并为此构建查询。因此,您可以显示前三个组件。

您好,谢谢您的回复。已经证实,如果没有其他方面的帮助,SQL中怀疑的内容将无法实现这一点。我必须试着用PHP编写一些东西来实现这一点。CheersI正在考虑你所说的Gordon的第三个选项,即确定组件的最大数量。我可能完全错误地处理了这个问题,但是我很难选择仍然在同一个查询中的独立列。我已经用新的公式修正了上面的问题details@user2001184 . . . 唉,即使在编写该选项时,我也意识到在MySQL中这样做有点困难,因为MySQWL缺少
row\u number()
函数。要使用第三个选项进行轴心旋转,您需要某种获取序列号的方法。例如,使用相关子查询是可能的,但在应用程序层执行它可能是最合理的选择。