2012-01-12 55 views
2

我處於這種情況,我的客戶通過電子郵件向我發送了一個包含50列數據的excel文件,這些數據非常規範化。然後我將它導出到CSV並上傳到MySQL - 單個表中。這些色譜柱適用於不同的成分(每種成分的10列數據 - 標題,類別等),然後是40種不同的色譜柱,以獲得每種成分的特徵。因此,表格中的每種成分都具有這50列,即使每列不適用於該成分。SQL僅返回行中沒有空列作爲新行

我的問題是,如果我可以創建一個SQL,只選擇一個選定的成分的填充特徵,並留下所有其他列?我知道另一個選擇是建立我自己的CSV解析器,它創建了多個表,然後爲它們編寫SQL,但我想調查解決這個問題,如果這不可行,那麼我只需要面對這一點,建立一個解析器; P)

這是據我來到但這並不完全排除未填寫欄(或包含「巾幗不讓鬚眉」

SELECT 
IF(`Heving-vanlig-gjaerbakst` <> '' AND `Heving-vanlig-gjaerbakst` <> 'nei', `Heving-vanlig-gjaerbakst`, 'random') AS `test1`, 
IF(`Frys-kort` <> '' AND `Frys-kort` <> 'nei', `Frys-kort`, 'random') AS `test2` 
... and for the 38 other rows ... 
FROM x 
WHERE id = 123 

我寧願沒有在PHP代碼中通過跳過空行解決這個問題= P

示例行(列名稱第一位):

g1  gruppe    ug1   undergruppe    artnr artikkel    beskrivelse            status enhet ansvar  prisliste Heving-vanlig-gjaerbakst Heving-soete-deiger Deig-stabilitet Smaksgiver Saftighet Krumme-poring Skorpe Volum Konservering Skjaerbarhet Frys-lang Frys-kort Kjoel Holdbarhet E-fri Azo-fri Mandler Aprikoskjerner Helmiks Halvmiks Base Konsentrat Utstrykning Bakefasthet Frukt-Baerinnhold Slippegenskaper Hindre-koksing Palmefri Fritering Smidighet Baking Kreming Roere Fylning Dekor Prefert Viskositet Cacaoinnhold Fet-innhold 
100150 Bakehjelpemidler 100150200 Fiber/potetprodukter 10085 Potetflakes sekk 15 kg Egnet til lomper, lefser, brød og annet bakverk. B... Handel Sekk Trond Olsen JA   xxx       xxx     xxx                          

正如您所見,大多數列都是空的。 X,XX和XXX是分級系統的一種形式,但對於某些列而言,內容是「是」或「否」。

正如我所說的,前10列是關於該產品的信息,另外40列是不同的特徵(並且這是我想爲一個給定產品工作的那些)。

+0

是否有某種方法來分類成分,知道應該應用哪些色譜柱?說,粘度,(如何「迅速」的液體流動)哪(可能)不適用於麪粉。這將改變你的數據庫的設計方式,最終的目的地。您將_probably_能夠完成SQL方面的所有工作,但我會推薦向您的導入表添加一個自動增量鍵(否則它應該與傳遞的文件相同)。 – 2012-01-12 16:39:19

回答

0

這聽起來有點,如果你想你的表格轉換成兩個表:

CREATE TABLE Ingredients 
(
    g1   ..., 
    gruppe  ..., 
    ug1   ..., 
    undergruppe ..., 
    artnr  ... PRIMARY KEY, 
    artikkel  ..., 
    beskrivelse ..., 
    status  ..., 
    enhet  ..., 
    ansvar  ..., 
    prisliste ... 
); 

我選擇了猜測,artnr是主鍵,但適應接下來要實際的主鍵。這個表格包含了所有成分通用的十一個(儘管你的問題說十個)列。然後您可以得到另一個表格,其中包含:

CREATE TABLE IngredientProperties 
(
    artnr  ... NOT NULL REFERENCES Ingredients, 
    property VARCHAR(32) NOT NULL, 
    value  VARCHAR(3) NOT NULL, 
    PRIMARY KEY(artnr, property) 
); 

然後,您可以將原始表中的已填充列加載到這兩個表中。最糟糕的情況是,IngredientProperties中的條目在Ingredient中會有一個條目。您可以將'property'變成對可能成分屬性定義列表的外鍵引用(第三個表定義屬性的可能值 - 基本上是原始表中列名的記錄)。如果添加第三個表格,它可能在邏輯上稱爲IngredientProperties(也是),在這種情況下,我稱爲IngredientProperties的表格需要重新命名。

然後,您可以加入Ingredients and IngredientProperties以獲取所需的信息。

我不確定我推薦這個解決方案;它基本上是使用「實體屬性值」方法來進行數據庫設計。但是,對於您似乎擁有的非常稀疏的信息,以及與第三個表的約束一起使用時。

你不能明智地做的是處理所有可能的40列組合,因爲這個數字隨着列數成指數增長(並且N = 40時相當大)。

+0

寫得很好的答案,但是使表格正常化在這個項目中是一個很大的禁忌。 由於時間限制,我們不建立多個表或任何自己的轉換,我們必須按原樣使用excel數據(這是客戶端使用其數據的形式)。而且我們無法創建出於同樣原因的管理界面。 但是我正在推遲1-2天的期限,以便我們可以花一些時間來構建我們自己的csv/excel-uploader。但是,除非我們確實知道構建一個真棒殺手SELECT-SQL反而是不可能的,否則那不是我們想要做的。 – Bellfalasch 2012-01-13 09:19:21