如何在事先使用MySQL查询MySQL查询

时间:2017-10-26 10:22:43

标签: mysql sql join

所以我一直在努力解决这个问题,并试图找出使用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

我知道我错过了一些代码,但我不确定从哪里开始,并且可以在正确的方向上使用一点点。

2 个答案:

答案 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) { ... }

希望它有所帮助!