Mysql SQL帮助,尝试获取结果中包含的正确数据

Mysql SQL帮助,尝试获取结果中包含的正确数据,mysql,sql,Mysql,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,

我有以下数据库

-- 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行中,
属性
*字段为空。我试图让查询返回4行。Jane Doe有两行,每个属性(BirthDate和EyeColor)有一行,我正在尝试为John Doe填写BirthDate属性的1行。我需要做些什么才能为每个选择要显示的库记录获取属性

编辑: 当我运行上面的查询时,我得到以下结果

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

我认为问题在于你的加入条件。具体而言,你有:

LEFT JOIN `Attributes` ON `Attributes`.`libraryID`=`Library`.`iD` AND `category`.`name`!='TypeOf'
请注意,连接条件的后半部分引用了
类别
,而我认为它应该是
属性

下面的查询似乎生成了您需要的结果(至少对我是这样):


我可以知道你为什么使用特定的数据类型
VARBINARY
??bcoz当我运行此查询时..它在
ID
column@diEcho-我用的是MAMP和phpMyAdmin。ID列都为我工作。当我浏览表(或运行简单的select查询)时,我会列出正确的值。之所以使用VARBINARY,是因为该表将从UUID索引,例如我刚才使用的示例数据是一个简单的十六进制数,而不是一个完整的128位UUID。@srerg-谢谢,我找了几个小时,没有找到问题。
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'))