我不确定单独使用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
希望能够做到这一点
干杯
伊恩
答案 0 :(得分:0)
严格地说,SQL中不可能实现您想要做的事情。 SQL要求预定义查询中的列。
一种可能的方法是为此目的使用动态SQL。您将计算数据中的最大组件数,然后使用此信息创建查询。
您已经在尝试第二种方法,即使用以逗号分隔的列表的分号分隔列表。
最后的方法是确定一些最大数量的组件,并为此构建查询。因此,您可以显示前三个组件。