为什么这个mysql查询无法根据行的值返回某些行

为什么这个mysql查询无法根据行的值返回某些行,mysql,sqlfiddle,Mysql,Sqlfiddle,我在SQLFIDLE中测试一个查询,发现了一些奇怪的东西: 如果你看看这个,它工作正常,或者我猜它的行为和预期的一样 但是他在做完全不同的事情 我注意到,根据时间戳的值,查询是否有效,这是sqlfiddle特有的还是sqllite特有的?发生了什么事 *编辑* 查询: SELECT * FROM a join b on a.id = b.id group by a.id having b.tstamp = max(b.tstamp) 首先,我不相信该查询能够正确运行 我的版本是: SELECT

我在SQLFIDLE中测试一个查询,发现了一些奇怪的东西:

如果你看看这个,它工作正常,或者我猜它的行为和预期的一样

但是他在做完全不同的事情

我注意到,根据时间戳的值,查询是否有效,这是sqlfiddle特有的还是sqllite特有的?发生了什么事

*编辑*

查询:

SELECT * FROM a
join b
on a.id = b.id
group by a.id
having b.tstamp = max(b.tstamp)

首先,我不相信该查询能够正确运行

我的版本是:

SELECT a.id AS id, MAX(b.tstamp) AS max_tstamp FROM a
  JOIN b ON a.id = b.id
  GROUP BY a.id

首先,我不相信该查询能够正确运行

我的版本是:

SELECT a.id AS id, MAX(b.tstamp) AS max_tstamp FROM a
  JOIN b ON a.id = b.id
  GROUP BY a.id

您的
HAVING
子句太晚了,它在分组后运行,每行不再有多条b记录,b包含表中的任意记录(通常是行顺序中的第一个匹配项,但这不应依赖),
HAVING b.something=MAX(b.something)
与说
HAVING 1=MAX(1)相同
1=1
,或者换句话说:对于组的随机记录始终为真

您想要的结果可以通过自连接或子查询来实现,我喜欢自连接,因为MySQL的性能非常好:

SELECT * 
FROM a
JOIN b b1
   ON b1.id = a.id
LEFT JOIN b b2
   ON b2.id = a.id
   AND b2.tstamp > b1.tstamp
WHERE b2.id IS NULL;

您的
HAVING
子句太晚了,它在分组后运行,每行不再有多条b记录,b包含表中的任意记录(通常是行顺序中的第一个匹配项,但这不应依赖),
HAVING b.something=MAX(b.something)
与说
HAVING 1=MAX(1)相同
1=1
,或者换句话说:对于组的随机记录始终为真

您想要的结果可以通过自连接或子查询来实现,我喜欢自连接,因为MySQL的性能非常好:

SELECT * 
FROM a
JOIN b b1
   ON b1.id = a.id
LEFT JOIN b b2
   ON b2.id = a.id
   AND b2.tstamp > b1.tstamp
WHERE b2.id IS NULL;

将链接粘贴到SQL Fiddle作为附加信息很有用,但您也应始终将有问题的查询粘贴到此处。将链接粘贴到SQL Fiddle作为附加信息很有用,但您也应始终将有问题的查询粘贴到此处。但此查询不会返回包含a.id的max(tstamp)的整行。我试图做的是返回每个a.idMySQL的
JOIN
系统的最大值(tstamp)的行,这是非常随意和不确定的,但是可以指导它产生正确的结果
ORDER BY b.tstamp
可以正确分组。但此查询不会返回包含a.id最大值(tstamp)的整行。我试图做的是返回每个a.idMySQL的
JOIN
系统的最大值(tstamp)的行,这是非常随意和不确定的,但是可以指导它产生正确的结果
ORDER BY b.tstamp
可以正确地分组。这是有意义的,因此此查询是无用的,因为无法在
group BY a.id
之前插入
ORDER BY b.tstamp DESC
?不,不正确。您可以选择子查询路径,或者使用我刚才添加的
JOIN
解决方案。请注意:如果存在具有完全相同的
tstamp
的b,这将返回a的2条(或更多)记录,这通常是可取的,但可能不是您想要的,在这种情况下,您可以再次
按a.id
分组,或者,如果您在平局中想要最高的
b.id
,则可能会返回,将
和b2.timestamp>b1.timestamp
更改为
和(b2.tstamp>b1.tstamp或(b2.tstamp=b1.tstamp和b2.id>b1.id))
,这是有意义的,因此此查询是无用的,因为不可能在
按a.id分组之前插入
ORDER BY b.tstamp DESC
,正确吗?不,不正确。您可以选择子查询路径,或者使用我刚才添加的
JOIN
解决方案。请注意:如果存在具有完全相同的
tstamp
的b,这将返回a的2条(或更多)记录,这通常是可取的,但可能不是您想要的,在这种情况下,您可以再次
按a.id
分组,或者,如果您在平局中想要最高的
b.id
,则可能会返回,将
和b2.timestamp>b1.timestamp
更改为
和(b2.tstamp>b1.tstamp或(b2.tstamp=b1.tstamp和b2.id>b1.id))