我有一个表,其中包含一个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.

Mysql相关问答推荐

mysql查询汇总数据

了解查询中ORDER BY的行为

使用由其中一个表的列规定的条件连接两个表

错误 2020 (HY000): 数据包大于 'max_allowed_pa​​cket' 字节,docker 容器内出现 mysql 错误

使用 presto 或 mysql 添加每个组中的缺失值

按唯一列排序,但保持匹配的列在一起

根据名称将值从一个字段复制到不同记录的同一字段

MySQL 可以用于将列表排序为三分之三吗?

从 MySQL WordPress Select 最后一行

使用sql查找源和最终目的地

最后一个字母 '%n' 的 mysql SELECT 字符串不起作用

MySQL 根据另一列中的值更改空值

如何在每个国家/地区查询 GHTorrent(类 SQL 语言)的最常用语言

如何使用 IF() 条件在 MySQL 中显示真假行

插入重复键查询以在每一行上进行自定义更新

如何存储百分比值?

docker-entrypoint-initdb 中的 MySQL 脚本未执行

MySQL 整数与日期时间索引

在 Postgresql 中模拟 MySQL 的 ORDER BY FIELD()

如何将具有相同列值的mysql行分组为一行?