Ecto.Adapters.SQL.query!给出了不同的结果。

问题描述 投票:1回答:1

所以,这显然是这些奇怪的日子之一... ... 我知道这毫无意义。

我在datagrip(一种执行原始查询的工具)中执行了一个与我的phoenix应用程序完全相同的数据库的查询。但它们返回的结果却不同。

enter image description here

这个查询相当复杂,但它是唯一显示不同结果的查询。所以我不能简化它。我已经尝试了其他查询,以确定我有相同的数据库,重启了服务器等等。

下面是在我的控制台执行的完全相同的查询。正如你所看到的,它是不一样的结果。少了几条记录。

enter image description here

我也检查了这是否是一个时间问题,通过执行 select now() => 同样的结果(或多或少很明显)。如果我只执行generate_series部分,它也返回同样的结果。所以这可能与连接有关。

我还检查了 ttnmessages 表,以确保不存在一般的缓存问题。查询也确实在那里给出了同样的结果。

所以我的问题是:Ecto在执行查询时有什么不同的做法吗?我怎么才能弄清楚这个问题呢?我很感激任何提示。

EDIT:查询在两种情况下都有。

SELECT g.series AS time, MAX((t.payload ->'pulse')::text::numeric) as pulse
FROM generate_series(date_trunc('hour', now())- INTERVAL '12 hours', date_trunc('hour', now()), INTERVAL '60 min') AS g(series)
LEFT JOIN ttnmessages t
ON t.inserted_at < g.series + INTERVAL '60 min'
AND t.inserted_at > g.series
WHERE t.hardware_serial LIKE '093B55DF0C2C525A'
GROUP BY g.series
ORDER BY g.series;
postgresql elixir ecto
1个回答
0
投票

虽然我没有找到原因,但我把查询改成了以下内容。

SELECT MAX(t.inserted_at) as time, (t.payload ->'pulse')::text::numeric as pulse
FROM ttnmessages t
WHERE t.inserted_at > now() - INTERVAL '12 hours'
  AND t.payload ->'pulse' IS NOT NULL
  AND t.hardware_serial LIKE '093B55DF0C2C525A'
GROUP BY (t.payload ->'pulse')
ORDER BY time;

运行时间是< 50ms,所以我很满意这个结果。

而我就不理会问题中的不同结果了。这里的查询就像它应该返回的结果一样。

© www.soinside.com 2019 - 2024. All rights reserved.