如何在 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_start
和 last_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_start
和 last_update
执行粗过滤(没有区域转换可以将时间偏移超过 +14:00
从 UTC
算起的小时数)。
然后,外部子查询将根据用户的时区对结果进行精细过滤。
如果你不喜欢子查询,你也可以使用:
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/