2016-06-09 95 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