如何查询男孩比游泳更喜爱的运动(基于Order列比较)
筛选男孩比游泳更喜爱的运动
需求说明
我们需要从两张表中筛选出所有**男孩(Sex='M')**比游泳更喜爱的运动,其中Order列代表喜爱顺序,数值越小表示越喜爱(1为最喜爱)。
表结构
Kids表
| Name | ID | Age | Sex |
|---|---|---|---|
| Kate | 1 | 15 | F |
| John | 2 | 16 | M |
| Tom | 3 | 6 | M |
Kids_sports表
| Kid_ID | Sport | Order |
|---|---|---|
| 1 | football | 1 |
| 1 | baseball | 3 |
| 1 | basketball | 5 |
| 1 | golf | 4 |
| 1 | Swimming | 2 |
| 2 | Swimming | 2 |
| 2 | golf | 1 |
| 2 | basketball | 3 |
| 3 | VolleyBall | 1 |
| 3 | Skiing | 3 |
| 3 | golf | 2 |
| 3 | Swimming | 4 |
解决方案
这里提供两种高效的SQL实现方式:
方法1:关联子查询
SELECT k.Name, ks.Sport FROM Kids k JOIN Kids_sports ks ON k.ID = ks.Kid_ID WHERE k.Sex = 'M' AND ks.Order < ( SELECT Order FROM Kids_sports WHERE Kid_ID = k.ID AND Sport = 'Swimming' ) ORDER BY k.Name, ks.Order;
方法2:自连接(大数据量场景下性能更优)
SELECT k.Name, ks.Sport FROM Kids k JOIN Kids_sports ks ON k.ID = ks.Kid_ID JOIN Kids_sports ks_swim ON k.ID = ks_swim.Kid_ID WHERE k.Sex = 'M' AND ks_swim.Sport = 'Swimming' AND ks.Order < ks_swim.Order ORDER BY k.Name, ks.Order;
输出结果
执行上述任意SQL语句,将得到符合预期的结果:
| Name | Sport |
|---|---|
| John | golf |
| Tom | VolleyBall |
| Tom | golf |
| Tom | Skiing |
逻辑说明
- 先筛选出所有男孩用户;
- 匹配每个男孩对应的游泳喜爱顺序值;
- 提取该男孩所有
Order值小于游泳顺序的运动记录; - 关联Kids表获取姓名并整理输出。
内容的提问来源于stack exchange,提问作者Qantirus
相关产品推荐
相关产品推荐

