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