SQL - 从一个星球上的人那里获得总认证数(3个单独的表)

时间:2016-10-26 00:31:28

标签: mysql sql

老实说,我不知道如何解决这个问题。我已经到了SELECT name然后我迷路了(有点尴尬)。

问题:查找按行星分组的人员持有的认证数量。这应该有两列,第一个,“名称”将是至少有一个认证的行星的名称。第二列应该是“CertCount”,并且将是来自该星球的人所持有的认证数量,例如,如果Lee获得“Viper”和“Mechanic”认证并且Kara获得“Viper”认证且他们都来自Caprica,那么caprica的“CertCount”应为3:

CREATE TABLE `bsg_cert` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB

CREATE TABLE `bsg_cert_people` (
  `cid` int(11) NOT NULL DEFAULT '0',
  `pid` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`cid`,`pid`),
  KEY `pid` (`pid`),
  CONSTRAINT `bsg_cert_people_ibfk_1` FOREIGN KEY (`cid`) REFERENCES `bsg_cert` (`id`),
  CONSTRAINT `bsg_cert_people_ibfk_2` FOREIGN KEY (`pid`) REFERENCES `bsg_people` (`id`)
) ENGINE=InnoDB

CREATE TABLE `bsg_people` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `fname` varchar(255) NOT NULL,
  `lname` varchar(255) DEFAULT NULL,
  `homeworld` int(11) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `homeworld` (`homeworld`),
  CONSTRAINT `bsg_people_ibfk_1` FOREIGN KEY (`homeworld`) REFERENCES `bsg_planets` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB

CREATE TABLE `bsg_planets` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `population` bigint(20) DEFAULT NULL,
  `language` varchar(255) DEFAULT NULL,
  `capital` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB

2 个答案:

答案 0 :(得分:1)

加入他们所有与小组进行计数应该做的诀窍:

SELECT  planet.name ,
    COUNT(*) AS cert_count
FROM    bsg_cert_people people_cert
    JOIN bsg_people people ON people.id = people_cert.pid
    JOIN bsg_planet planet ON people.homeworld = planet.id
GROUP BY planet.name

答案 1 :(得分:0)

SELECT pl.name, count(cert) AS "CertCount"
FROM bsg_planets pl
JOIN bsg_people pe ON pl.id = pe.homeworld
JOIN bsg_cert_people cp ON cp.pid = pe.id
GROUP BY pl.id

我认为就是这样。

相关问题