选择没有子表

时间:2018-01-09 10:58:53

标签: mysql select left-join

我的客户数据表如下:

enter image description here

并且子数据表如下:

enter image description here

现在我正在尝试访问子数据表中没有的数据

例如

我希望客户符合以下条件

1)今天的日期应该在客户到期日减去( - )2个月,这意味着访问客户将在今天的两个月后到期

2)客户应该是会员而不是管理员

3)今天系统尚未向特定客户发送通知

4)通知类型应为" 6"

按照上述测试数据

如果今天的日期 2018-01-09 ,那么结果应为

第一位客户" Jiren" 系统已发出通知

第一位客户" Lee" 系统已发送通知

所以我想要客户ID 3和4

我使用了以下查询,但无法正常运行:

SELECT customer_id,customer_token,customer_name,expiry_date
,DATE_FORMAT(`expiry_date` - INTERVAL '2' MONTH, '%Y-%m-%d') AS 
ExpireLim,notification_id FROM customer
LEFT JOIN notification ON customer.customer_id = notification.no_customer_id 
WHERE customer_token != '' AND no_type = '6' 
AND DATE_FORMAT(no_date,'%Y-%m-%d') = '2018-01-09' 
AND customer_token != 'device_token' AND is_member = 1 
AND CURRENT_DATE = `expiry_date` - INTERVAL '2' MONTH 
AND is_admin = 0

1 个答案:

答案 0 :(得分:1)

不要加入。如果您想知道通知是否存在,请使用EXISTSIN条款。

SELECT 
  customer_id,
  customer_token,
  customer_name,
  expiry_date,
  DATE_FORMAT(EXPIRY_DATE - INTERVAL 2 MONTH, '%Y-%m-%d') as expirelim
FROM customer c
WHERE customer_token != ''
AND expiry_date BETWEEN CURRENT_DATE AND CURRENT_DATE + INTERVAL 2 MONTH 
AND is_member = 1
AND is_admin = 0
AND NOT EXISTS
(
  SELECT *
  FROM notification n
  WHERE n.customer_id = c.customer_id
  AND n.no_type = 6
  AND date(n.no_date) = date '2018-01-09'
);

我认为notification.customer_id不能为空。因此,您可以使用更简单的NOT IN代替NOT EXISTS

AND customer_id NOT IN
(
  SELECT customer_id
  FROM notification
  WHERE no_type = 6
  AND date(no_date) = date '2018-01-09'
);

您可能需要调整到期条款。我把它意味着从现在到现在+ 2个月过期。这包括时间。也许你更想要date(expiry_date)。顺便说一下,月长不是一件精确的事情;从2月1日到3月1日的时间比从3月1日到4月1日的时间短。也许您想要将此规则定为60天或类似。