我不确定这是否可以单独使用 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
- 以及相关的“格式”数据。
我希望这可以做到
干杯
伊恩