You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:23:14