mysql - 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