mysql - 选择最新日期(子查询)

标签 mysql subquery

对于我使用的查询,我希望它输出最新日期,但是,该表确实很复杂。出于示例目的,我在表中使用以下四个条目:

Database Entries

Table Structure

由于兼容性问题,我没有对 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

这个查询在做什么?

  1. 在子查询中,您首先选择 MatchDate > 今天的所有记录。从这些记录中,您可以任意选择一条记录( LIMIT 1 )(没有 ORDER BY )。
  2. 找到这个 future 日期后,您想从表中进行选择。您有三个条件:HomeTeamID = 1 OR AwayTeamID = 1 AND MatchDate = <some future date> 。你正在混合ANDOR不使用括号,所以 AND优先于OR 。这意味着您有:HomeTeamID = 1 OR (AwayTeamID = 1 AND MatchDate = <some future date>) 。这可能是您想要的,也可能不是。
  3. 从符合条件的所有记录中,您任意选择一个(再次 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/

相关文章:

mysql - 以下查询没有给我预期的结果,请帮助我

postgresql - 获取每一行的列表值(来自另一个表的 ID 列表)

MySQL 使用 sum 加速子查询

php - 计算查询中的一行在所有表中出现的次数

mysql - 使用串联字段时出现歧义列 SQL 错误

php - 用户间私有(private)消息系统

MySQL 通过 ID 查找下一行值

php - 向mysql表中插入数据表格

sql - 子查询与内连接 - 哪一个执行得更快?

php - 在 mysql php 中选择不同的值