选择不包含其他表中特定数据的数据

时间:2016-06-09 03:03:43

标签: mysql join

我有两张桌子:

+-------------------------+
| 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年)没有付费年金并已过期的域名。

示例:如果我今天(2016年6月9日)运行查询,我的查询结果应该过滤mysite.com域,但不应过滤myecommerce.com域,因为mysite.com已于10月2日到期,2016年的年金未支付,而myecommerce.com将于8月15日到期。

我正在使用MySQL。如何编写SQL查询?

谢谢!

2 个答案:

答案 0 :(得分: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());

答案 1 :(得分: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;