[英]MySQL query to generate columns from row data but within the same table?
我正在學習以專家的方式設計桌子,但是我不確定這是否是正確的方法。
我有一個表,其中我將一個主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 | +--------+----------+----------+----------+-----------+ ----------+
您在這里建議的結構是針對“樹”之類的數據結構,其中的概念是,一切都位於父級到子級的繼承數據模型中。
考慮只在一個地方存儲數據。 例如,如果字符串“ S001”將被多個記錄使用,則創建基於星型的模式或更復雜的雪花模式將是更好的選擇。
由於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`
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.