因此,我已经为这个问题苦苦挣扎了一段时间,并试图找出使用JOIN的最佳方法,以获得找到每个行星的"CertCount“的答案。我知道它想按行星分组,但我不知道行星是从哪里来的。下面是问题和代码:
查找按星球分组的人员所持有的证书数量。这应该有两列,第一列,"name“将是至少有一个认证的行星的名称。第二列应该是"CertCount“,并将是来自那个星球的人持有的认证数量。例如,如果李获得了”毒蛇“和”机械师“的认证,而卡拉获得了”毒蛇“的认证,并且他们都来自卡布里卡,那么卡布里卡的"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因此,目前:我有以下几点:
SELECT bsg_planets.name ,
COUNT(*) AS CertCount
FROM bsg_cert_people people_cert我知道我遗漏了一些代码,但我不确定从这里到哪里去,可以在正确的方向上稍微推动一下。
发布于 2017-10-26 19:08:02
您需要根据表的主键和外键来连接表,然后执行GROUP BY
SELECT ps.id,
ps.name ,
COUNT(distinct *) AS CertCount
FROM bsg_cert_people cp
JOIN bsg_people pe ON cp.pid = pe.id
JOIN bsg_planets ps ON pe.homeworld = ps.id
GROUP BY ps.id, ps.name发布于 2017-10-26 19:59:04
您所需要做的就是根据表的公共id在所有3个表之间进行内连接,然后使用Planet id进行分组。
以下查询应可用:
SELECT ps.name ,
count(cert.cid) AS CertCount
FROM bsg_cert_people cert
JOIN bsg_people people ON cert.pid = people.id
JOIN bsg_planets planet ON people.homeworld = planet.id
GROUP BY plsnet.id
having count(distinct *) > 0;希望它能帮上忙!
https://stackoverflow.com/questions/46951894
复制相似问题