多次使用子查询与计算的最佳实践是什么?到目前为止,我一直在使用子查询,但是当您只需要从上一个查询中计算出的变量时,它们似乎太荒谬了(在下面的示例中,我们讨论的是带有子查询和子查询的查询)。
那么哪种是正确/最佳实践方法?就个人而言,作为一名程序员,我的一切都告诉我使用方法 a,因为复制粘贴计算似乎很愚蠢,但同时,子查询并不总是很好看,因为它可以使查询使用文件排序而不是索引排序(如果我错了,请纠正我)。
方法 a -子查询:
SELECT
tmp2.*
FROM
(
SELECT
tmp.*,
(NOW() < tmp.expire_time) as `active`
FROM
(
SELECT
tr.orderid,
tr.transactiontime,
pa.months as `months`,
DATE_ADD(tr.transactiontime, INTERVAL pa.months MONTH) as `expire_time`
FROM
`transactions` as `tr`
INNER JOIN
`packages` as `pa`
ON
tr.productid = pa.productid
WHERE
tr.isprocessed = '1'
ORDER BY
tr.transactiontime ASC
) as `tmp`
) as `tmp2`
WHERE
tmp2.active = 1
解释:
方法 b -重用计算:
SELECT
tr.orderid,
tr.transactiontime,
pa.months as `months`,
DATE_ADD(tr.transactiontime, INTERVAL pa.months MONTH) as `expire_time`,
(NOW() < DATE_ADD(tr.transactiontime, INTERVAL pa.months MONTH)) as `active`
FROM
`transactions` as `tr`
INNER JOIN
`packages` as `pa`
ON
tr.productid = pa.productid
WHERE
tr.isprocessed = '1'
AND
(NOW() < DATE_ADD(tr.transactiontime, INTERVAL pa.months MONTH))
ORDER BY
tr.transactiontime ASC
解释:
注意如何DATE_ADD(tr.transactiontime, INTERVAL pa.months MONTH)
重复 3 次,并(NOW() < DATE_ADD(tr.transactiontime, INTERVAL pa.months MONTH))
重复 2 次。
似乎方法 B 要好得多,但我仍然不喜欢它必须进行 3 次相同计算的EXPLAINs
事实(我假设它这样做,并且不保存结果并替换所有实例本身。) .