2013-08-26 78 views
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子句中使用別名,因爲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 

仍然是一個錯誤。請幫忙。謝謝。

+0

你能告訴我們這個錯誤嗎? – Fastidious

+0

如果你收到一個錯誤是什麼? @崇尚不僅僅是一種好的做法,而是在我的書中必不可少的。 –

+0

@ andy-g PHP警告:mysql_fetch_array()期望參數1是資源,布爾值 –

回答

1

由於您使用的是合計MAX()所以您應該將它放在HAVING子句中而不是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 
    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 
+0

它沒有錯誤。但是,它沒有得到我想要的。我應該得到:一封聯繫電子郵件(例如[email protected]),其中'expiration_date'= 2013年9月5日。 我只是不明白。 –

+0

爲了幫助您,您必須提供更多信息。特別是實際的表格模式(對於這兩個表格)以及應該產生上述記錄的相關示例數據。 – peterm

+0

這應該只是反映了這一結果,因爲我做它只是爲: 從我的表 '支付': PAYMENTDATE = 2013年8月5日 到期日期= 2013年9月5日 DATE_ADD(NOW(),INTERVAL 10 DAY) = 2013年9月5日 從我的表「product_key」: CONTACT_EMAIL = [email protected] CLIENT_NAME =卡爾·安傑洛帕維亞 所以我假設使用的查詢來獲取這些數據。 –

1

你不能在where子句中使用select子句中定義的別名。但這不要緊,因爲你要使用having條款:

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子句中可以使用別名。此外,我添加表的別名到您的查詢,使其更具可讀性。

+0

:它沒有錯誤。但是,它也沒有得到任何結果。我手動將我的最新'paymentdate'設置爲2013年9月5日我的一個數據,因此它應該反映我何時運行查詢,但什麼也沒有。 –