【问题标题】:MySQL query to generate columns from row data but within the same table?MySQL查询从行数据但在同一个表中生成列?
【发布时间】:2012-03-29 05:42:58
【问题描述】:

我正在学习如何按照专业人士的方式设计表格,但我不确定这是否正确。

我有一个表,我将主 ID 存储在 id 中,而 parent_id 指的是父级,也在同一个表中

表结构

如果不存在“目录”,则创建表( `id` int(3) NOT NULL AUTO_INCREMENT, `p_name` 长文本不为空, `p_code` varchar(255) NOT NULL, `p_brand` varchar(255) NOT NULL, `p_version` varchar(5) NOT NULL, `parent_id` varchar(255) NOT NULL, 主键(`search_id`) ) 引擎=MyISAM 默认值; +--------+----------+----------+---------+-------- ----+-----------+ |编号 | p_name | p_code | P_品牌 | p_版本| parent_id | +--------+----------+----------+---------+-------- ----+-----------+ | 1 |阿尔法 | S001 | X | 1 | 6 | | 2 |阿尔法 | S032 | X | 2 | 6 | | 3 |阿尔法 | S403 | X | 3 | 6 | | 6 |棱镜 | S004 | | 1 | | | 6 |棱镜 | S044 | | 2 | | +--------+----------+----------+---------+-------- ----+ ----------+

我查看了数据透视表,但它不符合我想要实现的目标。

我希望在不使用查找表的情况下生成显示每个 id 的版本的报告。

+--------+----------+----------+---------+-------- ----+-----------+ |编号 | p_name |版本 1|版本 2|第 3 版 | parent_id| +--------+----------+----------+---------+-------- ----+-----------+ | 1 |阿尔法 | S001 | S032 | S43 1 | 6 | +--------+----------+----------+---------+-------- ----+ ----------+

【问题讨论】:

    标签: mysql


    【解决方案1】:

    由于 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`
    

    【讨论】:

    • 这很棒。看起来我需要重新设计整个表,而不是在同一个表中使用层次结构。谢谢。
    【解决方案2】:

    您在此处建议的结构是用于类似“树”的数据结构,其概念是所有内容都位于从父级到子级的层次结构数据模型中。

    想想只有一个地方有数据。例如,字符串“S001”如果要被多个记录使用,那么创建一个基于星型的模式或更复杂的雪花模式将是更好的选择。

    【讨论】:

    • 星型架构看起来像我应该在这里使用的。
    猜你喜欢
    • 2016-01-13
    • 1970-01-01
    • 2015-06-18
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多