2011-07-25 29 views
0

我在數據庫中有兩個表,一個是個人,另一個是他們的屬性。如何用mysql中的規範化屬性創建視圖?

CREATE TABLE IF NOT EXISTS `person` (
    `ID` INT NOT NULL AUTO_INCREMENT , 
    PRIMARY KEY (`ID`)) 
ENGINE = InnoDB 

CREATE TABLE IF NOT EXISTS `property` (
    `ID` INT NOT NULL AUTO_INCREMENT , 
    `person_ID` INT NULL , 
    `property` VARCHAR(45) NULL , 
    `value` VARCHAR(45) NULL , 
    PRIMARY KEY (`ID`)) 
ENGINE = InnoDB 

在屬性表,我會插入像

(1, '名', '瑪麗') (1, '性別', '女')

(2, '名', '約翰') (,2, '性別', '男性') (,2, '高度', '165釐米')

我怎麼會去有關使視圖聲明,可以生成這些列: person_ID,名稱,性別,身高,(和任何其他屬性mig HT出現)

謝謝你在前進,

+1

是否有一個特別的原因,你不會簡單地將屬性合併到'person'表中?這讓我想起了一些元數據庫。舉個例子,我希望每個人都有一個名字和一個性別。 – Naltharial

回答

1

試試這一個。

SELECT 
    p.ID, prop.name, prop.gender, prop.height 
FROM 
    person p 
    JOIN 
    (
    SELECT 
     person_ID, 
     MAX(IF(`property` = 'name', `value`, NULL)) AS name, 
     MAX(IF(`property` = 'gender', `value`, NULL)) AS gender, 
     MAX(IF(`property` = 'height', `value`, NULL)) AS height 
    FROM 
     property 
    GROUP BY 
     person_ID) prop 
    ON p.ID = prop.person_ID; 

請注意,在此解決方案中,所有字段和值都是硬編碼的。

+0

這種規範化將需要我爲每個需要規範化的變量進行自定義查詢。我需要一些可以接受任何數量變量的東西。 – rickypai

+0

這個技巧可以幫助你 - http://buysql.com/mysql/14-how-to-automate-pivot-tables.html – Devart