2011-11-17 45 views
0

我有以下的數據庫SQL幫助,試圖得到正確的數據包含在我的結果

-- MYSQL 
DROP TABLE IF EXISTS Attributes; 
DROP TABLE IF EXISTS LibraryHistory; 
DROP TABLE IF EXISTS Library; 

CREATE TABLE Library (
    iD    VARBINARY(16) NOT NULL, -- UUID & PK 
    name   NVARCHAR(500) NOT NULL, -- Name for the entry 
    contentType  NVARCHAR(50) NOT NULL, -- Mime type of data 
    content   LONGBLOB  NOT NULL, -- Data a for the entry 
    subsectionOf VARBINARY(16),   -- Library UUID & FK 
    subsectionOrder INT,      -- Oder of Subsections 
    lastModifiedBy VARBINARY(16),   -- User UUID & FK 
    lastModified DATETIME  NOT NULL, -- Last time the record was updated 
    PRIMARY KEY (`iD`) 
); 

CREATE TABLE LibraryHistory (
    iD    VARBINARY(16) NOT NULL, -- UUID & PK 
    libraryID  VARBINARY(16) NOT NULL, -- Library UUID & FK 
    name   NVARCHAR(500) NOT NULL, -- Name for the entry 
    contentType  NVARCHAR(50) NOT NULL, -- Mime type of data 
    content   LONGBLOB  NOT NULL, -- Data a for the entry 
    subsectionOf VARBINARY(16),   -- Library UUID & FK 
    subsectionOrder INT,      -- Oder of Subsections 
    lastModifiedBy VARBINARY(16),   -- User UUID & FK 
    lastModified DATETIME  NOT NULL, -- Last time the record was updated 
    PRIMARY KEY (`iD`) 
); 

CREATE TABLE Attributes (
    iD    VARBINARY(16) NOT NULL, -- UUID & PK (Potentially could be removed) 
    libraryID  VARBINARY(16) NOT NULL, -- Library UUID & FK 
    name   NVARCHAR(500) NOT NULL, -- Name of attribute 
    dataType  INT   NOT NULL, -- The type of data the attribute holds (int, date, string, etc.) 
    data   NVARCHAR(500) NOT NULL, -- Value of attribute 
    lastModifiedBy VARBINARY(16),   -- User UUID & FK 
    lastModified DATETIME  NOT NULL, -- Last time the record was updated 
    PRIMARY KEY (`iD`) 
); 

ALTER TABLE Library ADD CONSTRAINT FK_subsection FOREIGN KEY (subsectionOf) REFERENCES Library(iD); 
-- ALTER TABLE Library ADD CONSTRAINT FK_modifier FOREIGN KEY (lastModifiedBy) REFERENCES Users(iD); 
ALTER TABLE LibraryHistory ADD CONSTRAINT FK_Hist_Library FOREIGN KEY (libraryID) REFERENCES Library(iD); 
ALTER TABLE Attributes ADD CONSTRAINT FK_Attr_Library FOREIGN KEY (libraryID) REFERENCES Library(iD); 

-- Example Data 
INSERT INTO `Library` VALUES(0x01, 'People', 'text', '', NULL, NULL, NULL, '2011-11-16 20:27:54'); 
INSERT INTO `Library` VALUES(0x02, 'Jane Doe', 'text', '', NULL, NULL, NULL, '2011-11-16 20:29:13'); 
INSERT INTO `Library` VALUES(0x03, 'Younger Years', 'text', '', 0x02, 1, NULL, '2011-11-16 00:00:00'); 
INSERT INTO `Library` VALUES(0x04, 'College Years', 'test', '', 0x02, 2, NULL, '2011-11-16 20:31:52'); 
INSERT INTO `Library` VALUES(0x05, 'Yale', 'text', '', 0x04, 2, NULL, '2011-11-16 20:32:44'); 
INSERT INTO `Library` VALUES(0x06, 'Community College', 'text', '', 0x04, 1, NULL, '2011-11-16 20:33:11'); 
INSERT INTO `Library` VALUES(0x07, 'John Doe', 'text', '', NULL, NULL, NULL, '2011-11-16 20:34:40'); 
INSERT INTO `Library` VALUES(0x08, 'Planets', 'text', '', NULL, NULL, NULL, '2011-11-16 20:27:54'); 
INSERT INTO `Library` VALUES(0x09, 'Earth', 'text', '', NULL, NULL, NULL, '2011-11-16 20:27:54'); 
INSERT INTO `Library` VALUES(0x10, 'Mars', 'text', '', NULL, NULL, NULL, '2011-11-16 20:27:54'); 

INSERT INTO `Attributes` VALUES(0x01, 0x02, 'TypeOf', 1, 0x01, NULL, '2011-11-16 20:34:40'); 
INSERT INTO `Attributes` VALUES(0x02, 0x02, 'BirthDate', 2, '19770521', NULL, '2011-11-16 20:34:40'); 
INSERT INTO `Attributes` VALUES(0x03, 0x02, 'EyeColor', 3, 'Brown', NULL, '2011-11-16 20:34:40'); 
INSERT INTO `Attributes` VALUES(0x04, 0x07, 'TypeOf', 1, 0x01, NULL, '2011-11-16 20:34:40'); 
INSERT INTO `Attributes` VALUES(0x05, 0x07, 'BirthDate', 2, '19740521', NULL, '2011-11-16 20:34:40'); 
INSERT INTO `Attributes` VALUES(0x06, 0x09, 'TypeOf', 1, 0x08, NULL, '2011-11-16 20:34:40'); 
INSERT INTO `Attributes` VALUES(0x07, 0x10, 'TypeOf', 1, 0x08, NULL, '2011-11-16 20:34:40'); 

到目前爲止,我有我的查詢看起來像這樣

SELECT `Library`.*, `Attributes`.* 
FROM `Library` 
LEFT JOIN `Attributes` AS `category` ON `category`.`libraryID`=`Library`.`iD` AND `category`.`name`='TypeOf' 
LEFT JOIN `Attributes` ON `Attributes`.`libraryID`=`Library`.`iD` AND `category`.`name`!='TypeOf' 
WHERE 
(`Library`.`name` = 'People' OR `category`.`data` = (SELECT iD FROM `Library` WHERE `Library`.`name` = 'People')) 

我得到3行返回,在所有3行中,Attributes。*字段爲空。我試圖讓查詢返回4行。 Jane Doe有兩行,每個屬性有一行(BirthDate和EyeColor),我試圖讓John Doe的1行填充BirthDate屬性。我需要做些什麼來獲取每個庫記錄的屬性選擇顯示?

編輯: 當我運行上面的查詢,我得到以下結果

iD name  contentType content  subsectionOf subsectionOrder lastModifiedBy lastModified   iD libraryID name dataType data lastModifiedBy lastModified 
01 People text   [BLOB - 0B] NULL   NULL   NULL   2011-11-16 20:27:54 NULL NULL  NULL NULL  NULL NULL   NULL 
02 Jane Doe text   [BLOB - 0B] NULL   NULL   NULL   2011-11-16 20:29:13 NULL NULL  NULL NULL  NULL NULL   NULL 
07 John Doe text   [BLOB - 0B] NULL   NULL   NULL   2011-11-16 20:34:40 NULL NULL  NULL NULL  NULL NULL   NULL 

我想獲得後續的結果

iD name  contentType content  subsectionOf subsectionOrder lastModifiedBy lastModified   iD libraryID name  dataType data  lastModifiedBy lastModified 
01 People text   [BLOB - 0B] NULL   NULL   NULL   2011-11-16 20:27:54 NULL NULL  NULL  NULL  NULL  NULL   NULL 
02 Jane Doe text   [BLOB - 0B] NULL   NULL   NULL   2011-11-16 20:29:13 02 02   BirthDate 2   19770521 NULL   2011-11-16 20:34:40 
02 Jane Doe text   [BLOB - 0B] NULL   NULL   NULL   2011-11-16 20:29:13 03 02   EyeColor 3   Brown  NULL   2011-11-16 20:34:40 
07 John Doe text   [BLOB - 0B] NULL   NULL   NULL   2011-11-16 20:34:40 05 07   BirthDate 2   19740521 NULL   2011-11-16 20:34:40 
+1

可我知道爲什麼u使用特定的數據類型'VARBINARY'? bcoz當我運行這個查詢時,它在'ID'列填充空白值 – diEcho

+0

@diEcho - 我使用的是MAMP和phpMyAdmin。 ID列全部爲我工作。當我瀏覽表格(或者運行一個簡單的選擇查詢)時,我會得到列出的正確值。使用VARBINARY是因爲表將從UUID索引,對於我剛剛使用簡單的十六進制數而不是完整的128位UUID的示例數據。 – Justin808

回答

0

我認爲這個問題是在你的加入條件。具體而言,您有:

LEFT JOIN `Attributes` ON `Attributes`.`libraryID`=`Library`.`iD` AND `category`.`name`!='TypeOf' 

注意,加盟條件引用category的後半部分時,我覺得應該是Attributes

下面的查詢似乎產生您需要的結果(至少對我來說它):

SELECT `Library`.*, `Attributes`.* 
FROM `Library` 
LEFT JOIN `Attributes` AS `category` ON `category`.`libraryID`=`Library`.`iD` AND `category`.`name`='TypeOf' 
LEFT JOIN `Attributes` ON `Attributes`.`libraryID`=`Library`.`iD` AND `Attributes`.`name`!='TypeOf' 
WHERE 
(`Library`.`name` = 'People' OR `category`.`data` = (SELECT iD FROM `Library` WHERE `Library`.`name` = 'People')) 
+0

@srerg - 謝謝我正在尋找幾個小時,錯過了這個問題。 – Justin808