为什么这个mysql查询无法根据行的值返回某些行
我在SQLFIDLE中测试一个查询,发现了一些奇怪的东西: 如果你看看这个,它工作正常,或者我猜它的行为和预期的一样 但是他在做完全不同的事情 我注意到,根据时间戳的值,查询是否有效,这是sqlfiddle特有的还是sqllite特有的?发生了什么事 *编辑* 查询:为什么这个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
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))