如何在 sql 中设置变量并在选择查询中使用它来显示和执行对该变量的操作(MAX MIN)?

Posted

技术标签:

【中文标题】如何在 sql 中设置变量并在选择查询中使用它来显示和执行对该变量的操作(MAX MIN)?【英文标题】:How to set a variable in sql and use it in select query to display and perform actions (MAX MIN) on that variable? 【发布时间】:2021-06-03 09:08:06 【问题描述】:

下面是我尝试运行的 mysql 查询。所以基本上我需要为当前日期和上次访问日期之间的差异设置一个变量。我需要在第二个查询中使用该变量来显示它或执行诸如 MAX(@last_visited) 或 MIN(@last_visited) 等操作。

SET @last_visited = (SELECT DATEDIFF(CURRENT_TIMESTAMP, MAX(date_time)) AS last_visited FROM bs_orders GROUP BY user_phone ORDER BY user_phone);

SELECT
    user_phone, @last_visited
FROM
    bs_orders
GROUP BY
    user_phone
ORDER BY 
    user_phone

【问题讨论】:

我迷路了。样本数据和期望的结果将清楚地表明您正在尝试做什么。 SET 完全令人困惑。您不能为返回多行的查询结果设置单个值。 【参考方案1】:

您不需要变量,只需即时计算即可:

SELECT
    user_phone, DATEDIFF(CURRENT_TIMESTAMP(), MAX(date_time)) as lastvisited
FROM
    bs_orders
GROUP BY
    user_phone
ORDER BY 
    user_phone

如果您愿意,您可以在运行查询之前使用当前时间戳创建一个变量,以便查询对所有行使用相同的时间。

正如在 cmets 中所说,您可以创建一个临时表并在进一步的查询中使用它:

CREATE TEMPORARY TABLE lastvisited(

    SELECT
        user_phone, DATEDIFF(CURRENT_TIMESTAMP(), MAX(date_time)) as lastvisited
    FROM
        bs_orders
    GROUP BY
        user_phone
    ORDER BY 
        user_phone
);

第二个查询示例:

Select * 
from TableT T
left join lastvisited L on L.user_phone=T.user_phone

【讨论】:

我在相同的代码中尝试了 MAX(DATEDIFF(CURRENT_TIMESTAMP, MAX(date_time))),但它不起作用。 是报错还是没有给你想要的结果? SELECT user_phone, DATEDIFF(CURRENT_TIMESTAMP, MAX(date_time)) AS last_visited, MAX(DATEDIFF(CURRENT_TIMESTAMP, MAX(date_time))) FROM bs_orders GROUP BY user_phone ORDER BY user_phone 我试过这个代码,但它给我的错误如下:错误代码:1111。无效使用组函数 我在答案中的查询应该给你“自上次访问以来的时间”。如果您需要严格的最后一次访问,那么 max(date_time) 就足够了。 请尝试我发布的查询; max 函数只需要在 datediff 函数内部

以上是关于如何在 sql 中设置变量并在选择查询中使用它来显示和执行对该变量的操作(MAX MIN)?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 TempTable 中检索值并在局部变量中设置该值

如何访问 Session 变量并在 javascript 中设置它们?

如何在路径中设置变量并在模板中显示?

如何使用 HUE 在 Impala 查询中设置变量?

如何在 VBA 中设置全局变量

在 app_controller 中设置一个变量并在 CakePHP 布局中使用它