サブクエリと計算を複数回使用するベスト プラクティスは何ですか? これまでサブクエリを使用してきましたが、前のクエリから計算された変数が必要な場合にサブクエリを使用するのはばかげているように思えます (次の例では、サブクエリを使用したサブクエリを使用したクエリについて説明しています)。
では、正しい/ベストプラクティスの方法はどれですか? 個人的に、プログラマーである私は、計算をコピーして貼り付けるのはばかげているように見えるので、メソッド 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 回繰り返され、 2 回繰り返されることに注意してください(NOW() < DATE_ADD(tr.transactiontime, INTERVAL pa.months MONTH))
。
方法 B の方がはるかに優れてEXPLAINs
いるように見えますが、同じ計算を 3 回実行する必要があるという事実は依然として嫌いです (これを行うと仮定し、結果を保存せず、すべてのインスタンス自体を置き換えません)。 .