0

これが 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
  • 関連する「フォーマット」データも。

これができることを願っています

乾杯

イアン

4

1 に答える 1

0

厳密に言えば、あなたがやりたいことはSQLでは不可能です。SQL では、クエリの列が事前に定義されている必要があります。

考えられるアプローチの 1 つは、この目的で動的 SQL を使用することです。データ内のコンポーネントの最大数を計算し、この情報を使用してクエリを作成します。

カンマ区切りリストのセミコロン区切りリストを使用する 2 番目のアプローチを既に試しています。

最後のアプローチは、コンポーネントの最大数を決定し、そのためのクエリを作成することです。つまり、たとえば最初の 3 つのコンポーネントを表示できます。

于 2013-01-28T15:12:58.410 に答える