2012-04-28 37 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