gpt4 book ai didi

mysql - 如何仅基于之间连接线?

转载 作者:行者123 更新时间:2023-11-29 18:07:57 25 4
gpt4 key购买 nike

我正在调查两个数据库表中两个不同条目的因果关系,但没有可以链接的通用 ID。

我唯一拥有的就是其中一个中的 unix 时间戳,以及另一个中的日期时间列。我很确定某个操作会触发另一个操作,但我需要仔细检查。

所以我尝试了这样的事情:

从请求中选择 *
RIGHT JOIN log_service on (log_service.date is BETWEEN FROM_UNIXTIME(1512312363) and FROM_UNIXTIME(1512312363+2))

例如,我在请求表中有行,timestamp_send 为 1512312363,并且在 log_service 表中有两个匹配行,其日期值如下:2017-12-03 16:46:022017-12-03 16:46:03(格林威治标准时间+2)

因此,我想右连接 log_service 表,将其与我正在查看的请求关联起来。

上面的查询尝试不起作用。它返回:
ELECT * FROM 请求
右连接 log_service on(log_service.date 介于 FROM_UNIXTIME(1512312363) 和 FROM_UNIXTIME(1512312363+2) 之间)
1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在第 2 行“BETWEEN FROM_UNIXTIME(1512312363) 和 FROM_UNIXTIME(1512312363+2))”附近使用的正确语法
时间:0.189秒

显然,完成的查询中的硬编码数字将是左表中的 requests.timestamp_send 列。

有什么建议吗?

最佳答案

正如我在对该问题的评论中指出的,首先,删除 BETWEEN 之前的虚假 IS 关键字。 (IS 关键字用于比较 bool 表达式,它不是 BETWEEN 比较运算符的一部分。)

对于日期时间范围比较,我们通常使用两次比较的模式,仅一侧包含相等性。

       foo >= start  AND  foo < end

有一些不错的文章介绍了其原因,以及 BETWEEN 引入的无意错误。但这可能不适合您的特定用例,您确实希望比较双方相等。我仍然推荐两次比较的模式,即使这意味着我们必须重复一个表达式。

       foo >= start  AND  foo <= end

我还建议放弃 SELECT 列表中的 *,并专门列出查询应该返回的表达式。这为 future 的读者提供了列的名称、列的数量以及更多关于哪些列实际上感兴趣的指示。

此外,我们似乎想要找到与“我正在查看的请求”关联的 log_service 行。这表明可能存在一些标准来识别我们感兴趣的请求中的行。

它还表明我们希望从请求中返回行,以及来自 log_service 的任何匹配行...这表明外部连接将是相反的,LEFT 连接而不是RIGHT 连接。

下一个问题是确定“日期”和“unix 时间戳”比较中涉及的列的实际数据类型。如果没有这些信息,我们只是猜测... request 中的 timestamp_send 列是 INTEGER 类型,包含自纪元开始以来的 unix 样式秒数, log_service 中的 date 列是 DATETIME。

根据提供的规范,我们倾向于编写如下查询:

SELECT rq.timestamp_send                AS rq_timestamp_send
, FROM_UNIXTIME(rq.timestamp_send) AS rq_datetime_send
, ls.date
, ls.foo
, ...
FROM requests rq
LEFT
JOIN log_service ls
ON ls.date >= FROM_UNIXTIME( rq.timestamp_send )
AND ls.date < FROM_UNIXTIME( rq.timestamp_send ) + INTERVAL 3 SECOND
WHERE rq.somecol = 'the request i am looking at'

关于mysql - 如何仅基于之间连接线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47666704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com