我正在尝试创建一个查询,该查询仅在满足2个条件的情况下才输出成员。

第一个条件:
用户是否具有匹配的“ courseID”。

第二个条件:
如果用户没有匹配的“ courseID”。

显然这是矛盾的,所以让我解释一下。

我有两张桌子

成员


ID
电子邮件


认证书


ID
会员ID
课程编号


成员完成课程后,他们将获得认证。认证存储其memberID和courseID。会员可以拥有多个认证。

最终目标是创建电子邮件发送列表以推广课程。

假设我们有两门课程。
“入门”(courseID = 1)和“中级”(courseID = 2)。

一个成员可以同时拥有两个证书,每个课程一个。另一个成员可能只有一个成员,即“初学者”认证。

我想向所有获得“初学者”认证的会员发送促销电子邮件。但是,我想排除所有具有“中级”认证的成员。

我似乎无法克服的问题是如何排除具有“中级”认证的成员。

**我已简化了此示例,实际上有大量不同的认证类型**

以下是我一直在尝试的粗略查询...我已经尝试过如此多种多样的查询。

任何帮助都会很棒,谢谢。

// Look Up Recipients
$recipientsQuery = $wpdb->get_results("
SELECT DISTINCT(email)
FROM $memberTable
LEFT JOIN $certificationsTable
ON $memberTable.ID = $certificationsTable.memberID
WHERE courseID = 4 AND courseID != 5
");

最佳答案

SELECT m.ID, m.email
   , MAX(IF(c.courseID = 4, 1, 0)) AS hasCourse4
   , MAX(IF(c.courseID = 5, 1, 0)) AS hasCourse5
FROM members AS m
LEFT JOIN certifications AS c ON m.ID = c.memberID
HAVING hasCourse4 = 1 AND hasCourse5 = 0
;


或者,您可以将证书加入到证书的成员中,这可能会更快:

SELECT m.email
FROM certifications AS c1
INNER JOIN members AS m ON c1.memberID = m.ID
LEFT JOIN certifications AS c2 ON m.ID = c2.memberID AND c2.courseID = 5
WHERE c1.courseID = 4 AND c2.courseID IS NULL
;

09-17 00:09
查看更多