【发布时间】:2020-11-10 22:23:27
【问题描述】:
我找不到我要找的东西,尽管这在 SQL 中似乎是一件“简单”的事情。
原来如此,
- 我有一个包含日期和国家/地区的表格,我们称之为 A。
- 我有一个从表 C 中选择国家列表的子查询,我们称之为 B。
目标是仅返回 A 中包含 B 中每个国家/地区的日期
例如,
A B (SELECT FROM C WHERE ...)
date country country
2020-07-21 1 1
2020-07-21 2 2
2020-07-12 1
2020-07-12 2
2020-07-06 1
2020-07-06 2
2020-07-06 3
应该返回
date
2020-07-21
2020-07-12
2020-07-06
但如果 B 是
B
country
1
2
3
那么它应该返回
2020-07-06
重点是获取所有国家/地区都列在 B 列表中的所有日期
我试过了
SELECT DISTINCT T.date FROM (
SELECT date
FROM A
WHERE country = ALL (SELECT country FROM C WHERE ...)
) AS T
但它不会返回任何内容,因为我认为它只会在所有内容都为真时才返回列表。
这是一个 MCRE:
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `countries` (
`country_id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`country_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `projects` (
`project_id` int(11) NOT NULL AUTO_INCREMENT,
`project_date` date NOT NULL,
`country_id` int(11) NOT NULL,
PRIMARY KEY (`project_id`),
KEY `country_id` (`country_id`),
CONSTRAINT `projects_ibfk_1` FOREIGN KEY (`country_id`) REFERENCES `countries` (`country_id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
INSERT INTO countries VALUES (1);
INSERT INTO countries VALUES (2);
INSERT INTO countries VALUES (3);
INSERT INTO projects(project_date, country_id) VALUES ('2020-07-21', 1);
INSERT INTO projects(project_date, country_id) VALUES ('2020-07-21', 2);
INSERT INTO projects(project_date, country_id) VALUES ('2020-07-12', 1)
INSERT INTO projects(project_date, country_id) VALUES ('2020-07-12', 2)
INSERT INTO projects(project_date, country_id) VALUES ('2020-07-06', 1);
INSERT INTO projects(project_date, country_id) VALUES ('2020-07-06', 2);
INSERT INTO projects(project_date, country_id) VALUES ('2020-07-06', 3);
这就是我尝试做的事情
SELECT project_id, project_date
from projects
where country_id = all (select country_id from countries where country_id in (1,2))
group by project_date
我知道子查询在这里没用,但实际上,条件与IN (1,2) 不同,但这简化了它,而不会失去我想要做的事情的意义。
在这个数据库中,子查询中有 (1,2),它应该返回每个日期,因为它们都有 country_id 1 和 2。但是,如果它设置为 (1,2,3),它应该只返回'2020-07-06' 作为一个组,因为它是 country_id 1,2 和 3 的唯一日期
【问题讨论】:
-
请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你期望的内容和原因。
-
这是一个常见问题解答。请在考虑发布之前阅读您的教科书和/或手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:stackoverflow.com 和标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。
-
你跳到(错误的)结论。在这篇文章中,也没有“您的问题/问题/目标的清晰、简洁和精确的措辞”,即问题。阅读帖子。请对 cmets 采取行动。
-
对不起,很遗憾,我从来都不擅长措辞。在这里,我将尝试解释,如果您愿意,可以尝试为它找到更好的措辞。我有一个与国家/地区相关联的日期列表,(通常,多个国家/地区会有相同的日期,但并非总是如此),而我想要做的是,基于一个可变的国家列表,获取所有日期链接到列表中的所有国家(日期必须链接到列表中的每个国家才能被考虑在内)
-
请通过编辑而不是 cmets 澄清。
标签: mysql sql mariadb relational-division