У меня есть следующая база данных
-- 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 строки. Две строки для Джейн Доу, по одной для каждого атрибута (BirthDate и EyeColor), и я пытаюсь получить 1 строку для Джона Доу, чтобы заполнить атрибут BirthDate. Что мне нужно сделать, чтобы получить атрибут для каждой записи библиотеки выбран для показа?
Edit:
Когда я запускаю приведенный выше запрос, я получаю следующий результат
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