为什么这个mysql查询无法返回某些行,具体取决于它们的值

时间:2013-05-15 19:52:52

标签: mysql sqlfiddle

我在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)

2 个答案:

答案 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