2016-06-09 84 views
0

具體數據選擇數據我有兩個表:它不包含在其他表

+-------------------------+ 
| Domain     | 
+-------------------------+ 
| DomainID  int  | 
| RegistryDate date  | 
+-------------------------+ 

而且

+-------------------------+ 
| Annuity     | 
+-------------------------+ 
| AnnuityID  int  | 
| DomainID  int  | 
| Year   smallint | 
+-------------------------+ 

在每個表中,我有這些註冊表項:

Domain: 
1 | mysite.com  | 2014-02-10 | 
2 | myecommerce.com | 2013-08-15 | 

Annuity: 
1 | 1 | 2014 
2 | 1 | 2015 
3 | 2 | 2013 
4 | 2 | 2014 
5 | 2 | 2015 

我需要過濾今年(2016年)沒有支付年金的域名,並且已過期。

例子:如果我今天運行查詢(6月,9,2016),我查詢結果應該過濾mysite.com域,但不應該過濾myecommerce.com域,因爲mysite.com已在2月10日,過期,以及對年金2016年沒有支付,而myecommerce.com將在8月15日到期。

我正在使用MySQL。我如何編寫SQL查詢?

謝謝!

+0

您的表中沒有指示您是否支付或未支付年金。在您的示例中,「myecommerce.com」和「mysite.com」都有2015年的條目。 – aneroid

+0

如果2016年有Annuity註冊表,則表示2016年已支付。 –

+0

我確定這就是你的意思:-)但是你的示例數據在Annuity中目前是:'1 | 1 | 2014','2 | 1 | 2015','3 | 2 | 2013','4 | 2 | 2014','5 | 2 | 2015'。這裏沒有2016年,都有2015年。 – aneroid

回答

0

對於這一點,你需要使用一個左外連接

SELECT d.id 
FROM Domain d 
LEFT OUTER JOIN Annuity a ON (d.id = a.DomainID AND a.Year = 2016) 
WHERE a.id IS NULL 
AND (MONTH(d.RegistryDate), DAY(d.RegistryDate)) < (MONTH(NOW()), DAY(NOW()); 
+0

如果我希望顯示任何未支付2016年年金的域名,此工作正常。但我只需要展示到期的域名(沒有2016年年金支付,截止日期是在今天之前)。 –

+0

在'where'中增加了一個附加條款。我*認爲*像這樣的工作在MySQL的元組比較(我知道他們在Postgresql中做的),但如果他們不這樣做,你可以解壓每月/每天的comarisons。 –

+0

它沒有工作,但我刪除了「日」過濾器,並在2016年工作。但我需要它適用於2016年和2015年。我會嘗試聯合查詢(即使它會是懶惰)。不管怎麼說,還是要謝謝你。 –

0

事實上,這個查詢是基於安德魯的回答。我想發表評論,但我沒有足夠的代表。

SELECT * FROM Domain d LEFT OUTER JOIN Annuity a 
ON (d.DomainID = a.DomainID AND a.Year = LEFT(CURRENT_DATE, 4)) 
WHERE a.DomainID IS NULL AND CONCAT(LEFT(CURRENT_DATE, 4), right(d.RegistryDate, 6)) > CURRENT_DATE; 
+0

您可以在「年金a」之前解釋CURRENT_DATE嗎?謝謝 –

+0

Oopss,對不起,它應該是LEFT OUTER JOIN – abhisuta

相關問題