MySQL如何跨表查询符合交易筛选条件的同UserID对应用户信息
MySQL跨表筛选用户信息实现方案
你可以通过三种常用写法实现需求,核心逻辑是先匹配交易表符合条件的用户ID,再返回对应用户的完整信息:
写法1:EXISTS半连接(推荐优先使用)
该写法无需手动去重,只要交易表存在至少一条符合筛选条件的记录,就会返回对应用户信息,匹配到第一条符合要求的交易记录后就会停止扫描该用户的其余交易数据,大表场景下性能最优:
SELECT u.* FROM Users u WHERE EXISTS ( SELECT 1 FROM Transaction t WHERE t.UserID = u.UserID AND t.TransactionType = 1 AND t.status = 1 AND (t.RealCash > 0 OR t.Bonus > 0 OR t.Winning > 0) );
写法2:INNER JOIN + 去重
通过内连接关联两表,加DISTINCT去除同一用户多条符合条件交易导致的重复用户行,逻辑直观易读,适合中小数据量场景:
SELECT DISTINCT u.* FROM Users u INNER JOIN Transaction t ON u.UserID = t.UserID WHERE t.TransactionType = 1 AND t.status = 1 AND (t.RealCash > 0 OR t.Bonus > 0 OR t.Winning > 0);
写法3:IN子查询
先在子查询中筛选出所有符合条件的用户ID集合,再匹配用户表查询全量信息。注意MySQL 5.5及更早版本对IN子查询的优化效果较差,大表场景不推荐使用,5.6之后版本可正常使用:
SELECT u.* FROM Users u WHERE u.UserID IN ( SELECT DISTINCT t.UserID FROM Transaction t WHERE t.TransactionType = 1 AND t.status = 1 AND (t.RealCash > 0 OR t.Bonus > 0 OR t.Winning > 0) );
优化提示:如果数据量较大,建议给Transaction表建立联合索引
(TransactionType, status, UserID),可以跳过全表扫描直接定位符合条件的用户ID,查询速度会有明显提升。
内容的提问来源于stack exchange,提问作者Yogesh
相关产品推荐
相关产品推荐

