これが MySQL だけで可能かどうか、または PHP などが必要かどうかはわかりません。私が作成しようとしているのは、ビューに表示される列の数を決定するために、1 つのテーブルに存在する情報の量に依存するビューです。
次のフィールドを含む 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
私が取得しようとしているビューは、(マスター アイテム テーブルからの) アイテムの表示に基づいています。各アイテムには 1 つまたは複数のコンポーネントがあります (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 にはコンポーネントが 1 つしかないため、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 は、複数の WHERE 句を SELECT ステートメントに入れることにまったく満足していないので、代わりに 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
- 関連する「フォーマット」データも。
これができることを願っています
乾杯
イアン