MySQL存储过程实现:筛选所有ID共有的source字段值
MySQL存储过程实现:找出所有ID共同拥有的Source值
核心逻辑
要筛选出所有ID共同拥有的source,关键验证规则是:每个source对应的唯一ID数量,等于表中所有唯一ID的总数——只有满足这个条件的source,才是所有ID都包含的。
基础版存储过程(固定表名)
假设你的表名为your_table,执行以下代码创建存储过程:
DELIMITER // CREATE PROCEDURE GetCommonSources() BEGIN -- 统计表中唯一ID的总数量 DECLARE total_unique_ids INT; SELECT COUNT(DISTINCT id) INTO total_unique_ids FROM your_table; -- 筛选符合条件的source SELECT source FROM your_table GROUP BY source HAVING COUNT(DISTINCT id) = total_unique_ids; END // DELIMITER ;
使用方式
调用存储过程即可得到结果:
CALL GetCommonSources();
对应你给出的示例数据,会返回10和20,符合预期。
进阶版存储过程(支持动态表名)
如果需要适配不同表,可以创建带参数的存储过程,动态传入表名:
DELIMITER // CREATE PROCEDURE GetCommonSources(IN target_table VARCHAR(64)) BEGIN -- 动态获取目标表的唯一ID总数 SET @count_sql = CONCAT('SELECT COUNT(DISTINCT id) INTO @total_ids FROM ', target_table, ';'); PREPARE count_stmt FROM @count_sql; EXECUTE count_stmt; DEALLOCATE PREPARE count_stmt; -- 动态筛选符合条件的source SET @query_sql = CONCAT( 'SELECT source FROM ', target_table, ' GROUP BY source HAVING COUNT(DISTINCT id) = @total_ids;' ); PREPARE query_stmt FROM @query_sql; EXECUTE query_stmt; DEALLOCATE PREPARE query_stmt; END // DELIMITER ;
调用时传入实际表名即可:
CALL GetCommonSources('your_table');
注意事项
- 替换代码中的
your_table为你实际的表名 - 如果表中存在
NULL值的id或source,可根据需求添加WHERE id IS NOT NULL AND source IS NOT NULL过滤条件
内容的提问来源于stack exchange,提问作者Jeppe
相关产品推荐
相关产品推荐

