【问题标题】:Getting common values in a table based on a subquery基于子查询获取表中的常用值
【发布时间】: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 和投票箭头鼠标悬停文本。
  • 你跳到(错误的)结论。在这篇文章中,也没有“您的问题/问题/目标的清晰、简洁和精确的措辞”,即问题。阅读帖子。请对 cme​​ts 采取行动。
  • 对不起,很遗憾,我从来都不擅长措辞。在这里,我将尝试解释,如果您愿意,可以尝试为它找到更好的措辞。我有一个与国家/地区相关联的日期列表,(通常,多个国家/地区会有相同的日期,但并非总是如此),而我想要做的是,基于一个可变的国家列表,获取所有日期链接到列表中的所有国家(日期必须链接到列表中的每个国家才能被考虑在内)
  • 请通过编辑而不是 cmets 澄清。

标签: mysql sql mariadb relational-division


【解决方案1】:

假设您从C 返回国家/地区的查询类似于:

select country_id from countries where country_id in (....)

然后像这样使用它:

select project_date
from projects
where country_id in (select country_id from countries where country_id in (...))
group by project_date
having count(*) = (select count(*) from countries where country_id in (...))

如果projects 中有重复的国家/地区,则将HAVING 子句更改为:

having count(distinct country_id) = (select count(*) from countries where country_id in (...))

请参阅demo

【讨论】:

    【解决方案2】:

    你可以试试下面的方法-

    select date
    from tablename 
    group by date
    having count(distinct country)=(select count(distinct country) from countryTable)
    

    【讨论】:

    • 我知道这是在做什么,但问题是我不能依靠计算国家,因为实际上有超过 2 个国家,我希望能够区分 1,2 和 2,3例如。
    猜你喜欢
    • 2020-09-26
    • 2016-12-08
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 2015-12-18
    • 2019-09-07
    相关资源
    最近更新 更多