选择子表中没有数据的客户

6yt4nkrj  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(229)

我的客户数据表如下:

子数据表如下:

现在我尝试访问子数据表中不可用的数据
例如
我要客户按以下条件
1) 今天的日期应该在客户到期日减去(-)2个月内,这意味着访问客户将在两个月后从今天起到期
2) 客户应该是会员而不是管理员
3) 今天系统还没有向特定客户发送通知
4) 通知类型应为“6”
根据以上试验数据
如果今天的日期是2018-01-09,那么结果应该是
第一个客户“jiren”系统已经发送了通知
第一个客户“李”系统已经发送了通知
所以我想要客户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
4ngedf3f

4ngedf3f1#

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

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天之类的。

相关问题