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