mysql - 在格式化 MySQL 查询以返回信息方面需要一些帮助

标签 mysql sql

这个问题是我的另一个问题@ 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/

相关文章:

mysql - `sysread' : 系统调用中断 (Errno::EINTR) 使用 Ruby 和 mysql 时

mysql - Laravel 5.2 如何更新我的用户表

当涉及内连接时 MySQL 条件选择

php - MySQL 查询不会在简单查询中返回所有可用行

MySQL加载数据文件非常慢/永远不会结束

mysql - 如何创建一个 MySQL 查询来获取每月每个日期(如日历)的销售额?

java - 参数号 1 不是 OUT 参数

mysql - 我如何在 MySQL 中执行此查询?

java - H2数据库可以查询包含不同记录组的多个部分的CSV文件吗?

sql - 如何使用嵌套查询避免 PostgreSQL 中的 DRY