sql - 在 mysql 中重用计算列

标签 sql mysql

如何在 MySQL 中重用 SQL 中的计算列? 说:我的查询是这样的:-

SELECT 
    CONVERT_TZ(
        if(timestamp_start > last_update, timestamp_start, last_update), 
        'GMT', 
        user.timezone
    ) as time_usr_tz
from 
    shecdule
    inner join user on shecdule.user_id = user.user_id
where 
    CONVERT_TZ(
        if(timestamp_start > last_update, timestamp_start, last_update), 
        'GMT', 
        user.timezone
    )
    < CURRENT_TIMESTAMP();

如果您看到查询“CONVERT_TZ.....”部分重复。

这只是一个示例查询。实际上,我必须多次使用该计算列。 所以如果我在一个地方做出改变,我必须改变很多地方。 查询的大小也变得可怕。

有什么办法可以避免这种重复?

更新 我的原始查询中已经有子查询,因此子查询不是一个更好的选择。有没有其他办法?

最佳答案

SELECT  ctz
FROM    (
        SELECT  shecdule.*,
                CONVERT_TZ(
                if(timestamp_start > last_update, timestamp_start, last_update), 
                'GMT', 
                user.timezone
                ) AS ctz
        FROM    shecdule
        INNER JOIN
                user
        ON      user.user_id = s.user_id
        ) s
WHERE  ctz < CURRENT_TIMESTAMP()

请注意,此查询没有有效地使用 timestamp_startlast_update 上的索引。

具体性能见我博客文章:

用两个词来说,你最好使用这个:

SELECT  ctz
FROM    (
        SELECT  shecdule.*,
                CONVERT_TZ(
                if(timestamp_start > last_update, timestamp_start, last_update), 
                'GMT', 
                user.timezone
                ) AS ctz
        FROM    shecdule
        INNER JOIN
                user
        ON      user.user_id = s.user_id
        WHERE   timestamp_start < CURRENT_TIMESTAMP() + INTERVAL 14 HOUR
                OR last_update < CURRENT_TIMESTAMP() + INTERVAL 14 HOUR
        ) s
WHERE  ctz < CURRENT_TIMESTAMP()

这个内部查询将使用索引对 timestamp_startlast_update 执行粗过滤(没有区域转换可以将时间偏移超过 +14:00UTC 算起的小时数)。

然后,外部子查询将根据用户的时区对结果进行精细过滤。

如果你不喜欢子查询,你也可以使用:

SELECT  shecdule.*,
        CONVERT_TZ(
        if(timestamp_start > last_update, timestamp_start, last_update), 
        'GMT', 
        user.timezone
        ) AS ctz
FROM    shecdule
INNER JOIN
       user
ON      user.user_id = s.user_id
/* 
        WHERE   timestamp_start < CURRENT_TIMESTAMP() + INTERVAL 14 HOUR
                OR last_update < CURRENT_TIMESTAMP() + INTERVAL 14 HOUR
*/
HAVING  ctz < CURRENT_TIMESTAMP()

关于sql - 在 mysql 中重用计算列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/776857/

相关文章:

php - Mysql 查询将在 1 分钟内自行执行

mysql - SQL外键执行顺序约束

mysql - 多列内连接返回重复记录

mysql - 添加 *1 到 addAttributeToSort 不起作用

sql - 在 SQL 查询中匹配部分日期?

sql - 使用表审计以获得表的 "snapshots"

sql - 遍历表中的组

mysql - 当在 MYSQL 中使用 substring_index 找不到值时为 NULL

sql - 比较三组行并选择其中的最大值?

mysql : Check duplicate value of a column in 3 different tables