我有一个表,其中包含一个id列和一个源列. 我只想返回所有ID共享的源值.
例如,在下面的表中,id 1、2、3都共享10和20,但id 3缺少源值30,因此30无效,我想返回10和20.
我正在使用MySQL,并希望将其放入存储过程中.
我该怎么做呢?
id | source |
---|---|
1 | 10 |
1 | 20 |
1 | 30 |
2 | 10 |
2 | 20 |
2 | 30 |
3 | 10 |
3 | 20 |
我有一个表,其中包含一个id列和一个源列. 我只想返回所有ID共享的源值.
例如,在下面的表中,id 1、2、3都共享10和20,但id 3缺少源值30,因此30无效,我想返回10和20.
我正在使用MySQL,并希望将其放入存储过程中.
我该怎么做呢?
id | source |
---|---|
1 | 10 |
1 | 20 |
1 | 30 |
2 | 10 |
2 | 20 |
2 | 30 |
3 | 10 |
3 | 20 |
您可以按如下方式使用COUNT(DISTINCT)
函数:
SELECT source FROM
table_name
GROUP BY source
HAVING COUNT(DISTINCT id)=(SELECT COUNT(DISTINCT id) FROM table_name)
要在存储过程中执行此操作,请执行以下操作:
CREATE PROCEDURE getSourceWithAllIds()
BEGIN
SELECT source FROM
table_name
GROUP BY source
HAVING COUNT(DISTINCT id)=(SELECT COUNT(DISTINCT id) FROM table_name);
END
其思想是 for each 源 Select 不同ID值的计数,这是由COUNT(DISTINCT id)... GROUP BY source
完成的,然后将该计数与表中存在的所有ID值的不同计数相匹配;HAVING COUNT(DISTINCT id)=(SELECT COUNT(DISTINCT id) FROM table_name)
.
如果两个计数相等,则源具有表中存在的所有不同的ID.
即,表中所有不同的ID是(1,2,3)count=3,并且对于源=10,不同的ID是(1,2,3)count=3.对于源=30,不同的ID是(1,2)count=2,因此它不会被查询(2;>3)返回.
请看demo.