MySQL查询从行数据生成列但在同一个表中?

时间:2012-03-12 19:35:08

标签: 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 |
+--------+----------+----------+----------+-----------+ ----------+ 

2 个答案:

答案 0 :(得分:0)

你在这里建议的结构是一个像数据结构一样的“树”,其概念是所有东西都存在于从父母到孩子的heirarcheal数据模型中。

想想只在一个地方拥有数据。例如,如果字符串“S001”将由多个记录使用,然后创建基于星形的模式或甚至更复杂的雪花模式将是更好的选择。

答案 1 :(得分: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`