所以我一直在努力解决这个问题,并试图找出使用JOIN的最佳方法来获得找到" CertCount"每个星球。我知道它想拥有它的GROUP BY行星,但我不知道行星来自哪里。以下是问题和代码:
查找按行星分组的人员持有的认证数量。这应该有两列第一个," name"将是至少有一个认证的行星的名称。第二列应为" CertCount"并且将是来自该星球的人所持有的认证数量,例如,如果Lee获得了#V; Viper"和#34;机械师"并且卡拉已通过" Viper"他们都来自Caprica,然后是" CertCount"对于caprica应该是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
我知道我错过了一些代码,但我不确定从哪里开始,并且可以在正确的方向上使用一点点。
答案 0 :(得分:1)
您需要根据主键和外键加入表,然后执行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
答案 1 :(得分:0)
您只需要根据表的常用ID在所有3个表中进行内部联接,然后使用Planet id进行分组。
以下查询应该有效:
if($powershellversion -lt 4 -and ($os1, $os2, $os3) -contains $winver) { ... }
希望它有所帮助!