MySQL将列拆分成视图中的动态列

时间:2013-01-28 15:03:06

标签: mysql views

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

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

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)

从Component表中选择的一个例子是:

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只有一个组件,因此,它在component2列中没有数据。如果在JUST项目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
  • 也带有关联的“格式”数据。

希望能够做到这一点

干杯

伊恩

1 个答案:

答案 0 :(得分:0)

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

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

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

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