0
SELECT product_key.contact_email, product_key.client_name, product_key.status, product_key.key, payment.paymentdate, product_key.id, MAX(paymentdate) AS latest_payment, DATE_ADD(MAX(paymentdate), INTERVAL 1 MONTH) AS expiration_date 
FROM product_key LEFT OUTER JOIN payment ON payment.keyid=product_key.id 
WHERE product_key.status = 'purchased' AND expiration_date = DATE_ADD(NOW(), INTERVAL 10 DAY) GROUP BY product_key.id 
ORDER BY client_name asc

これは私の質問です。WHERE句はSELECTの前に最初に読み込まれるため、WHERE句でエイリアスを使用できないことはわかっています。しかし、私がこのようなものを使用しても:

SELECT product_key.client_name, DATE_ADD(MAX(paymentdate), INTERVAL 1 MONTH) AS expiration_date 
FROM product_key LEFT OUTER JOIN payment ON payment.keyid=product_key.id 
WHERE DATE_ADD(MAX(paymentdate), INTERVAL 1 MONTH) = DATE_ADD(NOW(), INTERVAL 10 DAY) AND product_key.status = 'purchased' 
GROUP BY product_key.id 
ORDER BY client_name asc

それでもエラーです。助けてください。ありがとう。

4

2 に答える 2

1

select句で定義されたエイリアスを句で使用することはできませんwherehavingしかし、句を使用したいので、それは問題ありません:

SELECT pk.contact_email, pk.client_name, pk.status, pk.key, p.paymentdate, pk.id,
       MAX(paymentdate) AS latest_payment,
       DATE_ADD(MAX(paymentdate), INTERVAL 1 MONTH) AS expiration_date 
FROM product_key pk LEFT OUTER JOIN
     payment p
     ON p.keyid = pk.id 
WHERE pk.status = 'purchased'
GROUP BY pk.id 
HAVING expiration_date = DATE_ADD(NOW(), INTERVAL 10 DAY)
ORDER BY client_name asc;

句で別名を使用できます。havingまた、クエリを読みやすくするために、クエリにテーブル エイリアスを追加しました。

于 2013-08-26T03:14:38.197 に答える
1

集計を使用しているため、 の代わりに句MAX()を配置する必要があります。それ以外のクエリが正しく機能していると仮定すると、次のように書き直すことができますHAVINGWHERE

SELECT product_key.client_name, 
       DATE_ADD(MAX(paymentdate), INTERVAL 1 MONTH) AS expiration_date 
  FROM product_key LEFT OUTER JOIN payment 
    ON payment.keyid=product_key.id 
   AND product_key.status = 'purchased' 
 GROUP BY product_key.id 
HAVING DATE_ADD(MAX(paymentdate), INTERVAL 1 MONTH) = DATE_ADD(NOW(), INTERVAL 10 DAY) 
 ORDER BY client_name

また

SELECT product_key.client_name, 
       DATE_ADD(MAX(paymentdate), INTERVAL 1 MONTH) AS expiration_date 
  FROM product_key LEFT OUTER JOIN payment 
    ON payment.keyid=product_key.id 
   AND product_key.status = 'purchased' 
 GROUP BY product_key.id 
HAVING expiration_date = DATE_ADD(NOW(), INTERVAL 10 DAY) 
 ORDER BY client_name
于 2013-08-26T03:08:49.050 に答える