对于我使用的查询,我希望它输出最新日期,但是,该表确实很复杂。出于示例目的,我在表中使用以下四个条目:
由于兼容性问题,我没有对 MatchDate 行使用日期索引。它似乎有效,但是当在子查询中使用 MIN()
函数时,它将停止使用 WHERE
过滤器。我希望它使用过滤器向我显示接下来的任何行(下一个匹配是什么),但它不应该是过去的。
SELECT ID, HomeTeamID, AwayTeamID, MatchDate, MatchTime FROM Matches
WHERE HomeTeamID = 1 OR AwayTeamID = 1
AND MatchDate = (SELECT MatchDate FROM Matches
WHERE MatchDate >= CURRENT_DATE()
LIMIT 1)
LIMIT 1
最佳答案
这是您的查询:
SELECT ID, HomeTeamID, AwayTeamID, MatchDate, MatchTime FROM Matches
WHERE HomeTeamID = 1 OR AwayTeamID = 1
AND MatchDate = (SELECT MatchDate FROM Matches
WHERE MatchDate >= CURRENT_DATE()
LIMIT 1)
LIMIT 1
这个查询在做什么?
- 在子查询中,您首先选择 MatchDate > 今天的所有记录。从这些记录中,您可以任意选择一条记录(
LIMIT 1
)(没有ORDER BY
)。 - 找到这个 future 日期后,您想从表中进行选择。您有三个条件:
HomeTeamID = 1 OR AwayTeamID = 1 AND MatchDate = <some future date>
。你正在混合AND
和OR
不使用括号,所以AND
优先于OR
。这意味着您有:HomeTeamID = 1 OR (AwayTeamID = 1 AND MatchDate = <some future date>)
。这可能是您想要的,也可能不是。 - 从符合条件的所有记录中,您任意选择一个(再次
LIMIT 1
,不带ORDER BY
)。
也许你想要这个:
SELECT ID, HomeTeamID, AwayTeamID, MatchDate, MatchTime
FROM Matches
WHERE (HomeTeamID = 1 OR AwayTeamID = 1)
AND MatchDate = (SELECT MatchDate FROM Matches
WHERE MatchDate >= CURRENT_DATE()
ORDER BY MatchDate
LIMIT 1);
与
相同SELECT ID, HomeTeamID, AwayTeamID, MatchDate, MatchTime
FROM Matches
WHERE (HomeTeamID = 1 OR AwayTeamID = 1)
AND MatchDate = (SELECT MIN(MatchDate) FROM Matches
WHERE MatchDate >= CURRENT_DATE());
但是,无论哪支球队要比赛,这都会为您提供下一个预定日期。然后您正在查找第 1 队在该日期将参加的一场比赛。您可能会找到这样的比赛,也可能找不到。
所以也许你更想要这个:
SELECT ID, HomeTeamID, AwayTeamID, MatchDate, MatchTime
FROM Matches
WHERE ID = (SELECT ID
FROM Matches
WHERE (HomeTeamID = 1 OR AwayTeamID = 1) AND MatchDate >= CURRENT_DATE()
ORDER BY MatchDate
LIMIT 1);
可以更简单地写为
SELECT ID, HomeTeamID, AwayTeamID, MatchDate, MatchTime
FROM Matches
WHERE (HomeTeamID = 1 OR AwayTeamID = 1) AND MatchDate >= CURRENT_DATE()
ORDER BY MatchDate
LIMIT 1;
这将查找 future 最接近的第 1 队比赛。如果 future 不存在第 1 队比赛,则不会返回任何行。
关于您的其他尝试:
查询1:
SELECT ID, HomeTeamID, AwayTeamID, min(MatchDate)
FROM Matches
WHERE HomeTeamID = 1 OR AwayTeamID = 1 AND DATE(MatchDate) >= CURRENT_DATE()
LIMIT 1
GROUP BY ID
这应该会导致错误,但也许 MySQL 允许 LIMIT
写在GROUP BY
之前。您选择所有记录WHERE HomeTeamID = 1 OR (AwayTeamID = 1 AND DATE(MatchDate) >= CURRENT_DATE())
。这些记录按 ID 进行分组,这实际上什么也不做,因为每个记录都应该有一个唯一的 ID。然后您选择ID, HomeTeamID, AwayTeamID, min(MatchDate)
哪里min(MatchDate)
就是MatchDate
,因为我们正在查看单个记录。然后您限制为一条没有 ORDER BY
的记录子句,所以在找到的所有记录中你可以任意选择一个。
查询2:
SELECT ID, HomeTeamID, AwayTeamID, min(MatchDate)
FROM Matches
WHERE HomeTeamID = 1 OR AwayTeamID = 1 AND DATE(MatchDate) >= DATE(CURRENT_DATE())
您选择所有记录WHERE HomeTeamID = 1 OR (AwayTeamID = 1 AND DATE(MatchDate) >= CURRENT_DATE())
。然后您选择min(MatchDate)
所有这些记录。将返回一行(或零行),因为您聚合了所有行(无 GROUP BY
子句)。您还可以选择ID, HomeTeamID, AwayTeamID
。这是无效的,因为你是聚合的,那么查到的记录应该显示哪个ID、哪个主客场呢?根据 session 设置,MySQL 会忽略这一点并选择一个 ID
, 一 HomeTeamID
以及 AwayTeamID
任意或抛出错误(理应如此)。
关于mysql - 选择最新日期(子查询),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50463340/