我在sqlfiddle中测试了一个查询并注意到一些奇怪的事情:
如果您看一下这个fiddle它正常工作,或者我猜它的行为符合预期。
但是this one正在做一些完全不同的事情。
我注意到,根据查询的工作时间戳的值或它的不同,这是sqlfiddle独有的东西还是sqllite的东西?发生了什么事?
*编辑*
查询:
SELECT * FROM a
join b
on a.id = b.id
group by a.id
having b.tstamp = max(b.tstamp)
答案 0 :(得分:4)
您的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;
答案 1 :(得分:1)
我不相信该查询首先正确运行。
我的版本是:
SELECT a.id AS id, MAX(b.tstamp) AS max_tstamp FROM a
JOIN b ON a.id = b.id
GROUP BY a.id