我有一個簡單的表 ItemType、ProductID 和 ProductName。
不幸的是,記錄的順序很重要,因為 ItemType='SKU' 與其上方的 ItemType='Product' 相關。
我需要創建一個新欄位,將“SKU”記錄與其上方的“產品”記錄相關聯。我所擁有的是;
| 物品種類 | 產品編號 | 產品名稱 |
|---|---|---|
| 產品 | 2000年 | 我的產品名稱 |
| 單品 | 195 | 紅色的 |
| 單品 | 207 | 藍色 |
| 單品 | 124 | 紅色的 |
| 產品 | 2005年 | 我的其他產品 |
| 單品 | 975 | 紅色的 |
| 單品 | 127 | 藍色 |
我想要的是;
| 物品種類 | 家長 | 產品編號 | 產品名稱 |
|---|---|---|---|
| 產品 | 2000年 | 我的產品名稱 | |
| 單品 | 2000年 | 195 | 紅色的 |
| 單品 | 2000年 | 207 | 藍色 |
| 單品 | 2000年 | 124 | 紅色的 |
| 產品 | 2005年 | 我的其他產品 | |
| 單品 | 2005年 | 975 | 紅色的 |
| 單品 | 2005年 | 127 | 藍色 |
基本上我試圖使用表中記錄的順序來建立父/子之間的關系。
我正在處理電子商務產品輸出檔案,這是一種我無法更改的可怕格式。
閱讀我認為我必須在 MySQL 中使用游標來實作我想要的,但我以前從未使用過它們。
非常感謝任何建議!
uj5u.com熱心網友回復:
請注意,這可能不是 100% 可靠,因為不應依賴回傳行的順序。它在我的測驗用例中有效。推動電子商務產品的輸出檔案格式更新或獲得對資料的只讀訪問權限以便您可以自己匯出它會更好,更安全。
我items根據你上面的例子創建了一個表格-
CREATE TABLE `items` (
`ItemType` ENUM('Product', 'SKU') NOT NULL,
`ProductID` INTEGER NOT NULL,
`ProductName` VARCHAR(30) NOT NULL
);
INSERT INTO `items` VALUES
('Product', 2000, 'My Product Name'),
('SKU', 195, 'Red'),
('SKU', 207, 'Blue'),
('SKU', 124, 'Red'),
('Product', 2005, 'My Other Product'),
('SKU', 975, 'Red'),
('SKU', 127, 'Blue');
此時ProductID未將其設定為 PK非常重要,因為它會導致行被重新排序ProductID。
添加新Parent列 -
ALTER TABLE `items`
ADD COLUMN `Parent` INTEGER DEFAULT NULL AFTER `ItemType`;
您可以創建一個查詢來使用用戶變數跟蹤當前的 ProductID -
SELECT
`ProductID`,
IF(`ItemType` = 'Product', @cur_ID := `ProductID`, NULL) AS `cur_parent_id`,
IF(`ItemType` = 'SKU', @cur_ID, NULL) AS `parent_id`
FROM `items`, (SELECT @cur_ID := NULL) `p`
然后使用以下查詢來更新Parent列 -
UPDATE `items`
INNER JOIN (
SELECT
`ProductID`,
IF(`ItemType` = 'Product', @cur_ID := `ProductID`, NULL) AS `cur_parent_id`,
IF(`ItemType` = 'SKU', @cur_ID, NULL) AS `parent_id`
FROM `items`, (SELECT @cur_ID := NULL) `p`
) t ON `items`.`ProductID` = `t`.`ProductID`
SET `items`.`Parent` = `t`.`parent_id`;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/386895.html
標籤:mysql
上一篇:使用PHP和HTML選擇選項在另一個mysql查詢中使用陣列資料
下一篇:復雜結構所需的SQL查詢
