簡體   English   中英

MySQL查詢從行數據生成列但在同一表內?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM