首页 > 解决方案 > ORDER BY datediff 使用多个表

问题描述

我正在整理一个查询,以返回为运动队效力的前 10 名最年轻球员的列表。

到目前为止,我已经设法做到这一点,方法是使用表“外观”,其中包含球员(包含在球员表中)为首发球队效力时的实例行,通过使用 DATEDIFF 比较球员的出生日期和日期比赛中的比赛数,然后按此结果排序行,即球员打过的最年轻的年龄。对于一般外观而言,这似乎可以单独工作。

我现在遇到的问题是我还需要考虑球员作为替补出场的时间(换人表)。我创建了一个 UNION 来查询出场表和替补表——这确实返回了一个点的准确数据,但有一个例外——它两次列出了同一个球员,一行是他们最早的出场,另一行是他们最早的替补出场。

我正在寻找有关如何最好地修改此查询的指导,以便为每个玩家只返回一行。即,如果他们的替补出场是在他们开始出场之前,那是唯一应该返回的出场。

这是我刚才运行的查询。服务器版本:5.7.32。

    (
    SELECT 
        DISTINCT A.AppearancePlayerID AS id,
        CONCAT(P.PlayerFirstName, ' ', P.PlayerLastName) AS playername,
        DATEDIFF(MIN(M.MatchDateTime), P.PlayerDOB) AS age_diff,
        P.PlayerDOB AS player_dob,
        MIN(M.MatchDateTime) AS match_date
    FROM 
        appearances A, matches M, players P
    WHERE 
        A.AppearanceMatchID = M.MatchID AND 
        P.PlayerID = A.AppearancePlayerID AND 
        DATE_FORMAT(P.PlayerDOB, '%d') != '00'
    GROUP BY id
    )
UNION
    (
    SELECT 
        DISTINCT S.SubstitutionPlayerIDIn AS id,
        CONCAT(P.PlayerFirstName, ' ', P.PlayerLastName) AS playername,
        DATEDIFF(MIN(M.MatchDateTime), P.PlayerDOB) AS age_diff,
        P.PlayerDOB AS player_dob,
        MIN(M.MatchDateTime) AS match_date
    FROM 
        substitutions S, matches M, players P
    WHERE 
        S.SubstitutionMatchID = M.MatchID AND 
        P.PlayerID = S.SubstitutionPlayerIDIn AND 
        DATE_FORMAT(P.PlayerDOB, '%d') != '00'
    GROUP BY id 
    )
ORDER BY age_diff ASC
LIMIT 0,10

标签: mysqluniondatediff

解决方案


推荐阅读