2012-04-28 64 views
1

这个问题是从我的@Need some advice and feedback on coding a many:many relationship in MySQL的另外一个问题的延伸一些帮助......需要格式化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   | 
+----------+-----------------+----------------+-----------------+----------------+ 

我注意到名字在上面visualizatio反复几次ñ,我也想知道是否使用GROUP_CONCAT将它们合并在一起是一个好主意。

我无法以这种方式连接这三个表来生成所需的查询。我发现了一些灵感(在这里有一位用户提供),发现在http://sqlfiddle.com/#!2/baf8d,但是我很难定制这个以适应我自己的需要(在这个例子中,姓和名在每个父/表中,而我继承这些字段来自Person超类。

下面的代码是我在决定问这个问题之前得到的最接近的代码,我认为如果我可以将这些查询合并在一起来匹配上面的结果,但我卡住了它...

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

我觉得有我的数据库架构中的人超是必要的(如播放器/父母和其他“人”的实体将有类似的细节)和它的东西,我宁愿离开。如果你能够帮助我解决这个问题,我将非常感激。

在此先感谢!

+0

罗布有每个孩子的父亲和母亲,所以你怎么能只需要一个父 – 2012-04-28 06:12:50

+0

两个亲@ ShaikhFarooque通过查看表格和视觉表示,是什么让你说我只带一位家长? – Rob 2012-04-28 06:34:44

+0

Rob将会有4列,FatherFirstName,FatherLastName,MotherFirstName,MotherLastName – 2012-04-28 06:48:49

回答

1

为您准确显示输出,你想加入的表如下:

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) 
+0

哇,这完美:)。我完全忘记了“ON”操作符 - 如果我记得这个问题,我不会有这么难的时候。我不知道你可以像这样使用motherID和fatherID:“JOIN Player ON(parent.parentID IN(Player.motherID,Player.fatherID))”。这对我来说是一条学习曲线(就像大多数编程语言一样),但是我可以在我的db中看到其他一些可以派上用场的地方。再次欢呼:)。 – Rob 2012-04-28 09:06:23

1

请检查一下。

select 
(select P.FirstName from Parent as P where P.ParentID = pl.FatherID) as FatherName, 
(select P.FirstName from Parent as P where P.ParentID = pl.MotherID) as MotherName, 
pl.FirstName as PlayerFirstName, pl.LastName as PlayerLastName from player pl