SQL内连接多条件查询问题:获取对应最近3场比赛的socc_shots数据
我来帮你梳理一下问题所在,你大概率是把LIMIT用错了位置——直接在关联后的查询里加LIMIT只会返回结果集的前N行,而不是先筛选出最后3个匹配项再关联射门数据。
核心逻辑误区
你的需求是先从socc_matches中锁定按日期排序的最后3个mc_id,再获取这些ID对应的所有socc_shots记录,但如果直接在关联查询后加ORDER BY + LIMIT,会把所有关联后的射门记录按日期排序,只取前3条射门,这和需求完全不符。
正确的实现方式
方法1:用子查询+IN筛选
先通过子查询拿到最近3个匹配的mc_id,再用这个集合筛选射门表:
SELECT s.* FROM socc_shots s WHERE s.idmatch IN ( -- 先获取按日期倒序的最后3个mc_id SELECT mc_id FROM socc_matches ORDER BY date DESC LIMIT 3 );
方法2:用JOIN关联临时表
把获取最近3个匹配ID的逻辑作为临时表,再和射门表关联:
SELECT s.* FROM socc_shots s JOIN ( SELECT mc_id FROM socc_matches ORDER BY date DESC LIMIT 3 ) AS recent_matches ON s.idmatch = recent_matches.mc_id;
额外注意点
- 确保
socc_matches的date字段是合法的日期/时间类型,否则排序逻辑会出错; - 如果存在多个匹配项日期相同的情况,
LIMIT 3会截断同日期的记录。如果需要包含日期排名前3的所有匹配(比如同一天有5个匹配,都要纳入),可以用窗口函数优化:
SELECT s.* FROM socc_shots s WHERE s.idmatch IN ( SELECT mc_id FROM ( SELECT mc_id, date, DENSE_RANK() OVER (ORDER BY date DESC) AS rnk FROM socc_matches ) AS ranked_matches WHERE rnk <= 3 );
内容的提问来源于stack exchange,提问作者user9324524
相关产品推荐
相关产品推荐

