2012-03-12 43 views
0

我正在學習按照專業人員的方式設計一張桌子,但我不確定這是否正確。MySQL查詢從行數據生成列但在同一個表內?

我在我在ID存儲主ID與PARENT_ID參照母體,也以相同的表的表

表結構

 
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 |   | 
+--------+----------+----------+----------+-----------+ ----------+ 

我已經研究過樞軸表,但它不符合我想要實現的。

我正在尋找生成一個報告,顯示每個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是共同的每一個版本,它看起來像你應該分裂您的表分爲三 - 根據您當前的結構,你可以使用一個交叉表查詢目錄表

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 2012-03-12 20:16:07

0

你的建議這裏的結構是一個「樹」之類的數據結構,其中的理念是,一切都在於從父heirarcheal數據模型,以一個孩子之內。

想想只有一個地方有數據。例如,字符串「S001」如果要被多條記錄使用,那麼創建一個基於星型的模式或者更復雜的雪花模式將是更好的選擇。

+0

基於星的模式看起來像我應該在這裏使用的。 – user1251668 2012-03-12 20:14:02

相關問題