SQL查询:如何获取同时购买Apple和Banana的用户相关记录?
解决方法
你的原SQL语句存在逻辑错误:同一行的Fruit字段不可能同时等于Apple和Banana,所以这个条件永远不会返回结果,而且字段名应该是Fruit而非x。针对百万行数据的场景,以下是两种高效的实现方案:
方案一:分组筛选用户后关联原表
这种方法先筛选出同时购买了Apple和Banana的用户,再关联原表获取这些用户的对应记录,适合数据量较大的场景:
SELECT t.Fruit, t.name FROM your_table t INNER JOIN ( -- 筛选出同时买了两种水果的用户 SELECT name FROM your_table WHERE Fruit IN ('Apple', 'Banana') GROUP BY name HAVING COUNT(DISTINCT Fruit) = 2 ) AS qualified_users ON t.name = qualified_users.name -- 只保留这两种水果的记录 WHERE t.Fruit IN ('Apple', 'Banana');
优化提示
给name和Fruit字段建立复合索引(CREATE INDEX idx_name_fruit ON your_table(name, Fruit);),能大幅提升分组和关联操作的效率,避免全表扫描。
方案二:使用EXISTS子查询
通过子查询验证同一用户是否存在另一种水果的记录,逻辑更直观:
SELECT Fruit, name FROM your_table t1 WHERE Fruit IN ('Apple', 'Banana') AND EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.name = t1.name -- 匹配当前记录对应的另一种水果 AND t2.Fruit = CASE WHEN t1.Fruit = 'Apple' THEN 'Banana' ELSE 'Apple' END );
注意事项
- 替换语句中的
your_table为你的实际表名; - 如果
Fruit字段值大小写敏感(比如apple和Apple被视为不同值),需保证查询条件与数据格式一致; - 同样建议给
(name, Fruit)建立复合索引,优化子查询的匹配速度。
内容的提问来源于stack exchange,提问作者user125942
相关产品推荐
相关产品推荐

