我的客户数据表如下:
并且子数据表如下:
现在我正在尝试访问子数据表中没有的数据
例如
我希望客户符合以下条件
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
答案 0 :(得分:1)
不要加入。如果您想知道通知是否存在,请使用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天或类似。