[英]Getting common values in a table based on a subquery
即使在 SQL 中這似乎是一件“簡單”的事情,我也找不到我正在尋找的東西。
所以這里,
目標是只返回 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.