我正在使用 php 中的 mysql 根据某些条件向客户发送电子邮件提醒电子邮件,如果该唯一客户具有活动 = 0 的 CA 帐户,它应该只返回结果和电子邮件客户有些客户有多个 CA 帐户,所以他们的会员资格既是 active=0,active=1
我已经尝试了下面的 SQL,它返回 3 个结果比利和丹尼尔是正确的,他们只是有活动= 0,所以应该出现Becky 对于她各自的 2 个 ca 帐户都有活动 = 0 和活动 = 1,因此 SQL 应该查看她的查询并意识到"没有 Becky 有活动 = 1",所以不应该出现。 这只有比利,丹尼尔回来了。
SELECT
u.id,
u.forename,
u.surname,
u.email,
m.password,
m.user_id,
m.active,
m.promotional_code
FROM
user u
LEFT JOIN ca_accounts c ON u.id = c.user_id
LEFT JOIN member m ON u.id = m.user_id
WHERE
u.active = 1 AND m.active = 1
AND m.group_id IN (26)
AND (from_unixtime(m.end_date) > NOW()
AND from_unixtime(m.end_date) < DATE_ADD(NOW(), INTERVAL 1 DAY))
AND c.active = 0
LIMIT 0, 25
收益 率:
id forename surname email password user_id active
2923 Billy billy@ NULL 2923 1
4763 Daniel daniel@ NULL 4763 1
781 Beckly becky@ NULL 781 1
它应该产生什么:
id forename surname email password user_id active
2923 Billy billy@ NULL 2923 1
4763 Daniel daniel@ NULL 4763 1
用户 ID 781 CA 帐户表的图像
从您提供的信息来看,问题似乎来自表 ca_accounts
,其中多行属于同一用户,具有不同的active
值(0
和 1
)。
要解决此问题,您可以将 ca_accounts
上的JOIN
转换为 WHERE
子句中的NOT EXISTS
,并使用相关的子查询来确保给定用户没有active = 1
ca_accounts
记录。
SELECT
u.id,
u.forename,
u.surname,
u.email,
m.password,
m.user_id,
m.active,
m.promotional_code
FROM
user u
LEFT JOIN member m ON u.id = m.user_id
WHERE
u.active = 1 AND m.active = 1
AND m.group_id IN (26)
AND (from_unixtime(m.end_date) > NOW()
AND from_unixtime(m.end_date) < DATE_ADD(NOW(), INTERVAL 1 DAY))
AND NOT EXISTS (
SELECT 1
FROM ca_accounts c
WHERE u.id = c.user_id AND c.active = 1
)
LIMIT 0, 25