0

我不确定这是否可以单独使用 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)

从 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 列中没有数据。如果只对第 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
  • 以及相关的“格式”数据。

我希望这可以做到

干杯

伊恩

4

1 回答 1

0

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

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

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

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

于 2013-01-28T15:12:58.410 回答