簡體   English   中英

基於子查詢獲取表中的常用值

[英]Getting common values in a table based on a subquery

即使在 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 的唯一日期

假設您從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 (...))

請參閱演示

你可以試試下面的方法——

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM