Помощь SQL, пытаясь получить правильные данные, включенные в мои результаты - PullRequest
0 голосов
/ 17 ноября 2011

У меня есть следующая база данных

-- 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

1 Ответ

0 голосов
/ 17 ноября 2011

Я думаю, что проблема в ваших условиях присоединения.В частности, у вас есть:

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'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...