2012-03-12 6 views
0

私はプロのやり方でテーブルをデザインすることを学んでいますが、これが正しいかどうかはわかりません。MySQLクエリは、行データから同じテーブル内の列を生成しますか?

私はピボットテーブルに見えたが、それき

表構造

 
CREATE TABLE IF NOT EXISTS `catalog` (
    `id` int(3) NOT NULL AUTO_INCREMENT, 
    `p_name` longtext NOT NULL, 
    `p_code` varchar(255) NOT NULL, 
    `p_brand` varchar(255) NOT NULL, 
    `p_version` varchar(5) NOT NULL, 
    `parent_id` varchar(255) NOT NULL, 
    PRIMARY KEY (`search_id`) 
) ENGINE=MyISAM DEFAULT; 

+--------+----------+----------+----------+-----------+-----------+ 
| id  | p_name | p_code | P_brand | p_version| parent_id | 
+--------+----------+----------+----------+-----------+-----------+ 
| 1  | Alpha | S001 |  X |   1 |   6 | 
| 2  | Alpha | S032 |  X |   2 |   6 | 
| 3  | Alpha | S403 |  X |   3 |   6 | 
| 6  | Prism | S004 |   |   1 |   | 
| 6  | Prism | S044 |   |   2 |   | 
+--------+----------+----------+----------+-----------+ ----------+ 

も同じ表に、I、親を参照PARENT_IDとIDのプライマリIDを格納するテーブルを有しています私が達成しようとしているものに合わない。

ルックアップテーブルを使用せずに各IDのバージョンを表示するレポートを生成したいと考えています。

 

+--------+----------+----------+----------+-----------+-----------+ 
| id  | p_name | version 1| version 2| version 3 | parent_id| 
+--------+----------+----------+----------+-----------+-----------+ 
| 1  | Alpha | S001 | S032 | S43 1 |   6 | 
+--------+----------+----------+----------+-----------+ ----------+ 

答えて

0

P_NAME、p_brandとp_parent_idは、それはあなたがおそらく3にあなたのテーブルを分割すべきであるように見えるの各バージョンに共通しているとして - カタログ表のためにあなたの現在の構造に基づいて

products (id, name, brand_id, parent_id) 
versions (id, product_id, code, version) 
brands (id, brand). 

あなたがクロス集計クエリを使用することができますこのような -

SELECT 
    `p_name`, 
    MAX(IF(`p_version` = 1, `p_code`)) AS `version 1`, 
    MAX(IF(`p_version` = 2, `p_code`)) AS `version 2`, 
    MAX(IF(`p_version` = 3, `p_code`)) AS `version 3`, 
    `parent_id` 
FROM `catalog` 
GROUP BY `p_name`, `parent_id` 

あなたは私の提案したテーブル構造を使用している場合、これはこのようなものに変更します -

SELECT 
    `p`.`name`, 
    MAX(IF(`v`.`version` = 1, `v`.`code`)) AS `version 1`, 
    MAX(IF(`v`.`version` = 2, `v`.`code`)) AS `version 2`, 
    MAX(IF(`v`.`version` = 3, `v`.`code`)) AS `version 3`, 
    `p`.`parent_id` 
FROM `products` `p` 
INNER JOIN `brands` `b` 
    ON `p`.brand_id` = `b`.`id` 
INNER JOIN `versions` `v` 
    ON `p`.`id` = `v`.`product_id` 
GROUP BY `p`.`name`, `p`.`parent_id` 
+0

これは素晴らしいことです。同じテーブルの階層を使用する代わりに、テーブル全体を再設計する必要があるように見えます。ありがとうございました。 – user1251668

0

あなたがここに示唆されている構造は、概念はすべてが親から子へheirarchealデータモデル内に存在するということであるデータ構造のような「木」のためです。

1か所にデータがあると考えてください。たとえば、複数のレコードで使用される場合は文字列「S001」を使用し、スターベースのスキーマを作成するか、より複雑なスノーフレークスキーマを作成する方がよいでしょう。

+0

スターベースのスキーマは、私がここで使用するはずのもののように見えます。 – user1251668

関連する問題