【发布时间】:2021-07-21 18:44:57
【问题描述】:
目前,我正在尝试运行一个查询,该查询返回每个已捕获特定类型的所有唯一“物种”的培训师的“培训师”用户名和“类型”标题。例如,如果有两个不同的物种在打架,而 Jenny 都抓住了他们,那么她应该这样输出:
---------------------
| Username | Type |
---------------------
| Jenny | Fighting |
---------------------
如果她还捕获了另一种类型的所有不同物种,则会输出另一行,但类型不同。这必须考虑到一个物种有两种类型,并且训练员可能会捕获一个以上的每个物种,因此要确定某人是否捕获了一个类型的所有物种,两种类型都被考虑在内。表格如下所示:
(Type) (Species) (Trainer) (Pokemon)
------------ ---------------------------- --------------- ------------------------
| id | title | | id | title | type1 | type2 | | id | username | | id | species | trainer |
------------ ---------------------------- --------------- ------------------------
我还提供了查询的架构和示例数据。在它下面有一个预期的结果集。到目前为止,我已经采取了一种方法来确定每种类型的独特物种有多少,使用以下查询:
SELECT Type.id AS TypeID, Type.title, COUNT(Species.id) AS 'Number of Species of Type'
FROM Type, Species WHERE Type.id = Species.type1 OR Type.id = Species.type2 GROUP BY Type.id;
我的下一个想法是确定训练师捕获的每种类型的物种数量,以便我可以比较两者。但我坚持如何构建查询来做到这一点。也不能使用视图或公用表表达式。任何建议或想法将不胜感激。
create database pokemon;
use pokemon;
CREATE TABLE IF NOT EXISTS `Type` (
`id` TINYINT NOT NULL,
`title` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`));
CREATE TABLE IF NOT EXISTS `Species` (
`id` TINYINT UNSIGNED NOT NULL,
`title` VARCHAR(50) NOT NULL,
`type1` TINYINT NOT NULL,
`type2` TINYINT NULL,
PRIMARY KEY (`id`),
FOREIGN KEY (`type1`) REFERENCES `Type` (`id`),
FOREIGN KEY (`type2`) REFERENCES `Type` (`id`));
CREATE TABLE IF NOT EXISTS `Trainer` (
`id` INT NOT NULL,
`username` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`));
CREATE TABLE IF NOT EXISTS `Pokemon` (
`id` BIGINT NOT NULL,
`species` TINYINT UNSIGNED NOT NULL,
`trainer` INT NULL,
PRIMARY KEY (`id`),
FOREIGN KEY (`trainer`) REFERENCES `Trainer` (`id`),
FOREIGN KEY (`species`) REFERENCES `Species` (`id`));
insert into Type values (1,'Normal');
insert into Type values (2,'Fighting');
insert into Type values (3,'Flying');
insert into Type values (4,'Poison');
insert into Type values (5,'Ground');
insert into Type values (6,'Rock');
insert into Type values (7,'Bug');
insert into Type values (8,'Ghost');
insert into Type values (9,'Steel');
insert into Type values (10,'Fire');
insert into Type values (11,'Water');
insert into Type values (12,'Grass');
insert into Type values (13,'Electric');
insert into Type values (14,'Psychic');
insert into Type values (15,'Ice');
insert into Type values (16,'Dragon');
insert into Type values (17,'Dark');
insert into Type values (18,'Fairy');
insert into Species values (100,'Voltorb',13,null);
insert into Species values (101,'Electrode',13,null);
insert into Species values (102,'Exeggcute',12,14);
insert into Species values (103,'Exeggutor',12,14);
insert into Species values (104,'Cubone',5,null);
insert into Species values (105,'Marowak',5,null);
insert into Species values (106,'Hitmonlee',2,null);
insert into Species values (107,'Hitmonchan',2,null);
insert into Species values (108,'Lickitung',1,null);
insert into Species values (109,'Koffing',4,null);
insert into Species values (110,'Weezing',4,null);
insert into Species values (111,'Rhyhorn',5,6);
insert into Species values (112,'Rhydon',5,6);
insert into Species values (113,'Chansey',1,null);
insert into Species values (114,'Tangela',12,null);
insert into Species values (115,'Kangaskhan',1,null);
insert into Species values (116,'Horsea',11,null);
insert into Species values (117,'Seadra',11,null);
insert into Species values (118,'Goldeen',11,null);
insert into Species values (119,'Seaking',11,null);
insert into Species values (120,'Staryu',11,null);
insert into Species values (121,'Starmie',11,14);
insert into Trainer values (1,'Ash');
insert into Trainer values (2,'Brock');
insert into Trainer values (3,'Misty');
insert into Trainer values (4,'Jenny');
insert into Trainer values (5,'Luna');
insert into Pokemon values (1,109,1);
insert into Pokemon values (2,110,1);
insert into Pokemon values (3,115,1);
insert into Pokemon values (4,113,1);
insert into Pokemon values (5,108,1);
insert into Pokemon values (6,117,1);
insert into Pokemon values (7,102,2);
insert into Pokemon values (8,103,2);
insert into Pokemon values (9,121,2);
insert into Pokemon values (10,104,2);
insert into Pokemon values (11,111,3);
insert into Pokemon values (12,112,3);
insert into Pokemon values (13,121,3);
insert into Pokemon values (14,106,4);
insert into Pokemon values (15,107,4);
insert into Pokemon values (16,110,4);
样本数据的预期结果集是:
---------------------
| Username | Type |
| --------------------|
| Ash | Poison |
| --------------------|
| Ash | Normal |
| --------------------|
| Brock | Psychic |
| --------------------|
| Misty | Rock |
| --------------------|
| Jenny | Fighting |
--------------------
【问题讨论】:
-
Misty与Ground不匹配,它被分配给该类型的 2 个物种,而该类型包含 4 个物种。 -
但是
Misty匹配到Rock... -
请不要通过破坏您的帖子为他人增加工作量。通过在 Stack Exchange 网络上发帖,您已在 CC BY-SA 4.0 license 下授予 Stack Exchange 分发该内容的不可撤销的权利(即无论您未来的选择如何)。根据 Stack Exchange 政策,帖子的非破坏版本是分发的版本。因此,任何破坏行为都将被撤销。如果您想了解更多关于删除帖子的信息,请参阅:How does deleting work?
-
也不要试图破坏您收到的答案。