1

我在 sqlfiddle 中测试一个查询并注意到一些奇怪的东西:

如果你看一下这个小提琴它工作正常,或者我猜它的行为符合预期。

但这一个正在做一些完全不同的事情。

我注意到,根据时间戳的值,查询是否有效,这是 sqlfiddle 独有的还是 sqllite 的东西?到底是怎么回事?

* 编辑 *

询问:

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

2 回答 2

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;
于 2013-05-15T19:58:43.673 回答
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
于 2013-05-15T19:56:25.173 回答