查询同一user_id下不同meta_key对应meta_value相等的用户ID
解决方案
针对这种键值对结构的用户元数据表,有两种常用的查询实现方式:
方案1:自连接查询(性能更优,适合大数据量表)
假设你的表名为user_meta,可直接执行以下SQL:
SELECT DISTINCT a.user_id FROM user_meta a INNER JOIN user_meta b ON a.user_id = b.user_id AND a.meta_key = 'first_name' AND b.meta_key = 'last_name' AND a.meta_value = b.meta_value;
逻辑说明:将元数据表分别取别名映射first_name和last_name两类记录,关联同一个用户下两类记录的值,相等即符合筛选条件,DISTINCT用于避免重复返回同一个用户ID。
方案2:分组聚合查询(扩展性更强,适合多字段比对场景)
SELECT user_id FROM user_meta WHERE meta_key IN ('first_name', 'last_name') GROUP BY user_id HAVING MAX(CASE WHEN meta_key = 'first_name' THEN meta_value END) = MAX(CASE WHEN meta_key = 'last_name' THEN meta_value END);
逻辑说明:先过滤出需要比对的两个元数据键的记录,按用户ID分组后分别取出两个键对应的值做比对,天然去重无需额外处理。如果后续需要比对更多meta_key,只需要在HAVING子句加对应判断即可。
两种方案执行后都会返回你示例中的1和2两个user_id结果。
内容的提问来源于stack exchange,提问作者WkL
相关产品推荐
相关产品推荐

