【问题标题】:Why does this mysql query fail to return certain rows depending on their value为什么此 mysql 查询无法根据其值返回某些行
【发布时间】:2013-05-15 19:52:51
【问题描述】:

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

【问题讨论】:

  • 粘贴到 SQL Fiddle 的链接作为附加信息很有用,但您也应该始终在此处粘贴有问题的查询。

标签: mysql sqlfiddle


【解决方案1】:

您的HAVING 子句来晚了,它在分组之后运行,每行不再有多个 b 记录,b 包含表中的 任意 记录(通常是行顺序中的第一个匹配项,但这应该不依赖),HAVING b.something = MAX(b.something) 与 HAVING 1 = MAX(1); 或 1=1 相同,或者换句话说:总是该组的随机记录为 true。

您想要的结果可以通过自联接或子查询来完成,我喜欢自联接,因为 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;

【讨论】:

  • 有道理,那么这个查询就没用了,因为不可能在GROUP BY a.id之前插入ORDER BY b.tstamp DESC对吗?
  • 不,不是。您可以使用子查询路线,或使用我刚刚添加的JOIN 解决方案。请注意:如果有 b 与 exact 相同 @987654329,这将返回 2 个(或更多)记录@,这通常是可取的,但可能不是您想要的,在这种情况下,您可以再次 GROUP BY a .id,或者如果您想要最高的 b.id,以防出现平局,将 AND b2.timestamp > b1.timestamp 更改为 @987654333 @
【解决方案2】:

我不相信该查询首先会正确运行。

我的版本是:

SELECT a.id AS id, MAX(b.tstamp) AS max_tstamp FROM a
  JOIN b ON a.id = b.id
  GROUP BY a.id

【讨论】:

  • 但此查询不会返回包含 a.id 的 max(tstamp) 的整行。我试图做的是返回每个 a.id 具有 max(tstamp) 的行
  • MySQL 的JOIN 系统非常随意且不确定,但可以通过指导产生正确的结果。 ORDER BY b.tstamp 可以正确分组。
猜你喜欢
  • 1970-01-01
  • 2016-03-21
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 2020-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多