2017-09-25 9 views
0

ユーザーが自分の製品のライセンスを購入したとき、新しい30日間に残りの日数を追加しようとしています。MySQL別のクエリの結果を使用する

SELECT 
    SUM(DATEDIFF(access_expires, CURDATE())) + 30 as access_remaining 
FROM wp_woocommerce_downloadable_product_permissions 
WHERE 
    user_email = '[email protected]' AND 
    product_id = 8 AND access_expires IS NOT NULL; 

UPDATE wp_woocommerce_downloadable_product_permissions 
SET 
    access_expires = DATE_ADD(CURDATE(), access_remaining) 
WHERE 
    user_email = '[email protected]' AND 
    product_id = 8 AND 
    access_expires IS NULL 

2番目のクエリで以前のクエリからaccess_remainingを使用することはできないようです。可能であれば、参加を使わずに助けてください。それが何かを意味するなら、mariadbを使う。

+0

このようなエイリアスは再利用できません。あなたが気にしていることに最も近いのは、更新可能なCTEですが、MySQLはサポートしていません。 –

+0

これは 'SET access_expires = DATE_ADD(access_expires、INTERVAL 30 DAY)'とまったく同じものではありませんか? –

答えて

1

あなたはこの問題に対して奇妙な制限を課したようです。厳密には/usr/bin/mysqlを使用していますか? PythonまたはJava?あなたは:=で一時変数に割り当てることができますか?なぜ参加しないのですか?

MySQL/SQL: Update with correlated subquery from the updated table itselfのように、相関サブクエリでUPDATEを使用することを検討してください。

カレンダーの有効期限を維持して、簿記をモデル化するための完全に賢明な方法を選択しました。しかし、モデリングを別の方法で考えてみましょう。お客様が支払った日付を保存(開始、終了)することができます。あなたはそれがいくつかの言い回しを簡単にすることができるかもしれません。

1

お知らせ「ユーザー変数」@arの使用:

SELECT 
    @ar := SUM(DATEDIFF(access_expires, CURDATE())) + 30 as access_remaining 
FROM wp_woocommerce_downloadable_product_permissions 
WHERE 
    user_email = '[email protected]' AND 
    product_id = 8 AND access_expires IS NOT NULL; 

UPDATE wp_woocommerce_downloadable_product_permissions 
SET 
    access_expires = DATE_ADD(CURDATE(), @ar) 
WHERE 
    user_email = '[email protected]' AND 
    product_id = 8 AND 
    access_expires IS NULL 

私はSUMは、この文脈で意味を成さないことを示唆しています。

これを行う方が簡単ではないでしょうか?

UPDATE wp_woocommerce_downloadable_product_permissions 
SET 
    access_expires = GREATEST(access_expires, CURDATE()) + INTERVAL 30 DAY 
WHERE 
    user_email = '[email protected]' AND 
    product_id = 8 AND 
    access_expires IS NULL 
関連する問題