-1

多次使用子查询与计算的最佳实践是什么?到目前为止,我一直在使用子查询,但是当您只需要从上一个查询中计算出的变量时,它们似乎太荒谬了(在下面的示例中,我们讨论的是带有子查询和子查询的查询)。

那么哪种是正确/最佳实践方法?就个人而言,作为一名程序员,我的一切都告诉我使用方法 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事实(我假设它这样做,并且不保存结果并替换所有实例本身。) .

4

1 回答 1

0

你应该看看 MySQL 的EXPLAIN命令:

http://dev.mysql.com/doc/refman/5.0/en/explain.html

它告诉您 MySQL 如何执行查询。

于 2012-10-05T10:02:14.020 回答