SQL SELECT和JOIN

时间:2019-03-08 22:47:03

标签: mysql sql join left-join

您好,我需要在MySQL查询中提供一些帮助。 我有2个表,需要找出表A中存在的值,而表B中不存在该值,在表B中要比较的值应具有当月列值为当前月。

表A

+------+
| id   |
+------+
| 1    |
| 2    |
| 3    |
| 4    |
| 5    |
+------+

表B

+------+-----+
| id   |Month|
+------+-----+
| 1    |March|
| 2    |March|
| 3    |April|
+------+-----+

我想显示表A中4月份该表中所有不存在的值。 就像ID 3支付了4月的费用,而ID 1和ID 2却没有支付。

结果表应如下所示。

+------+
| id   |
+------+
| 1    |
| 2    |
+------+

我尝试了多个查询,例如

SELECT * FROM A LEFT JOIN B ON A.id = B.id WHERE B.id IS NULL and B.month=(current date)

SELECT * FROM A LEFT JOIN (select * from B where month=(current month)) ON A.id = B.id WHERE B.id IS NULL 

我不明白我在这方面做错了什么。很抱歉出现任何错字错误,因为该错误已通过手机发布。

3 个答案:

答案 0 :(得分:0)

显示表B中4月份该表B中不存在的所有值

cityFound

答案 1 :(得分:0)

我认为您需要在表A中添加更多条件,因为它没有“月”列。并且由于表b中的“ month”值是字符串(“ March”而不是“ 3”),因此也必须定义它。您可以尝试此查询,看看它是否有效。

SELECT * FROM (SELECT id,MONTH(CURRENT_DATE) AS "curMonth" FROM A) a LEFT JOIN B ON a.id=b.id AND curmonth=MONTHNAME(STR_TO_DATE(b.month,'%b'));

您也可以使用该查询。假设您想提前查看一个月或一个月,可以添加INTERVAL条件。这种情况也可以满足当月的情况。

SELECT * FROM (SELECT id,MONTH(DATE_SUB(CURRENT_DATE, INTERVAL 0 MONTH)) AS "curMonth" FROM A) a LEFT JOIN B ON a.id=b.id AND curmonth=MONTHNAME(STR_TO_DATE(b.month,'%b'));

对于当前日期的上个月数据,您可以更改为INTERVAL 1 MONTH,对于当前月份的数据,您可以更改为INTERVAL 0 MONTH,对于提前1个月的数据,您可以更改为INTERVAL -1 MONTH

答案 2 :(得分:-1)

尝试:

SELECT * FROM TableA WHERE id NOT IN (SELECT id FROM TableB)

这将从TableA中获得不在tableB中的所有行。

这在SQL Server中有效,但是我不确定MySQL。