-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 回繰り返され、 2 回繰り返されることに注意してください(NOW() < DATE_ADD(tr.transactiontime, INTERVAL pa.months MONTH))

方法 B の方がはるかに優れてEXPLAINsいるように見えますが、同じ計算を 3 回実行する必要があるという事実は依然として嫌いです (これを行うと仮定し、結果を保存せず、すべてのインスタンス自体を置き換えません)。 .

4

1 に答える 1

0

EXPLAINMySQL のコマンドを確認する必要があります。

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

これは、MySQL がクエリを実行する方法を示しています。

于 2012-10-05T10:02:14.020 に答える