这个问题是我的另一个问题@ Need some advice and feedback on coding a many:many relationship in MySQL 的延伸...
我有以下表的 MySQL 代码:
DROP TABLE IF EXISTS `person` ;
CREATE TABLE `person` (
`personID` INT(5) NOT NULL AUTO_INCREMENT ,
`firstName` VARCHAR(50) NOT NULL ,
`lastName` VARCHAR(50) NOT NULL ,
`dateOfBirth` DATE NOT NULL ,
`personType` CHAR(6) NOT NULL,
`photo` BLOB NULL DEFAULT NULL ,
PRIMARY KEY (`personID`))
ENGINE = InnoDB;
SHOW WARNINGS;
DROP TABLE IF EXISTS `parent` ;
CREATE TABLE `parent` (
`parentID` INT(5) NOT NULL,
PRIMARY KEY (`parentID`),
FOREIGN KEY (`parentID`) REFERENCES `person` (`personID`)
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB;
SHOW WARNINGS;
DROP TABLE IF EXISTS `player` ;
CREATE TABLE Player (
`playerID` INT(5) NOT NULL,
`motherID` INT(5),
`fatherID` INT(5),
`schoolID` INT(5),
PRIMARY KEY (`playerID`),
FOREIGN KEY (`playerID`) REFERENCES `person` (`personID`)
ON DELETE CASCADE
ON UPDATE CASCADE,
FOREIGN KEY (`motherID`) REFERENCES `parent` (`parentID`)
ON DELETE CASCADE
ON UPDATE CASCADE,
FOREIGN KEY (`fatherID`) REFERENCES `parent` (`parentID`)
ON DELETE CASCADE
ON UPDATE CASCADE,
FOREIGN KEY (`schoolID`) REFERENCES `school` (`schoolID`)
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB;
SHOW WARNINGS;
我想格式化一个查询,使其返回如下信息:
+----------+-----------------+----------------+-----------------+----------------+
| ParentID | ParentFirstName | ParentLastName | PlayerFirstName | PlayerLastName |
+----------+-----------------+----------------+-----------------+----------------+
| 1 | John | Doe | Maggie | Doe |
| 1 | John | Doe | Rob | Doe |
| 2 | Jane | Doe | Rob | Doe |
| 2 | Jane | Doe | Maggie | Doe |
| 3 | Peter | Smith | Neil | Smith |
| 3 | Peter | Smith | Chad | Smith |
| 4 | Mary | Mason | Neil | Smith |
| 4 | Mary | Mason | Chad | Smith |
+----------+-----------------+----------------+-----------------+----------------+
我注意到在上面的可视化中名称重复了几次,我也想知道使用 GROUP_CONCAT 是否是一个以某种方式将它们合并在一起的好主意。
我无法以这种方式连接这三个表来生成所需的查询。我在 http://sqlfiddle.com/#!2/baf8d 找到了一些灵感(由此处的用户提供) ,但是我无法根据自己的需要自定义它(在示例中,名字和姓氏在每个父/玩家表中,而我从 Person 父类(super class)继承这些字段。
下面的代码是我决定在这里提问之前得到的最接近的代码。我想不知何故我是否可以将这些查询合并在一起以匹配类似上面的结果,但我坚持下去......
mysql> select person.firstName as ParentFirstName, person.lastName as ParentLastName from person where
-> person.personID IN (select * from parent);
+-----------------+----------------+
| ParentFirstName | ParentLastName |
+-----------------+----------------+
| John | Doe |
| Jane | Doe |
| Peter | Smith |
| Mary | Mason |
+-----------------+----------------+
mysql> select person.firstName as ChildFirstName, person.lastName as ChildLastName from person where
-> person.personID IN (select player.playerID from player);
+----------------+---------------+
| ChildFirstName | ChildLastName |
+----------------+---------------+
| Maggie | Doe |
| Rob | Doe |
| Neil | Smith |
| Chad | Smith |
+----------------+---------------+
我觉得在我的数据库模式中有 Person 父类(super class)是必要的(因为玩家/ parent 和其他“人”实体会有类似的细节)并且我宁愿留下它。如果你能帮助我得到解决这个问题,我将不胜感激。
提前致谢!
最佳答案
对于您显示的确切输出,您希望按如下方式加入表格:
SELECT
parent.parentID AS ParentID,
ParentPerson.firstName AS ParentFirstName,
ParentPerson.lastName AS ParentLastName,
ChildPerson.firstName AS PlayerFirstName,
ChildPerson.lastName AS PlayerLastName
FROM
parent
JOIN Player ON (parent.parentID IN (Player.motherID, Player.fatherID))
JOIN person AS ParentPerson ON (ParentPerson.personID = parent.parentID)
JOIN person AS ChildPerson ON ( ChildPerson.personID = Player.playerID)
关于mysql - 在格式化 MySQL 查询以返回信息方面需要一些帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10360850/