MYSQL:多重“矛盾”单列条件


MYSQL: Multiple "contradicting" conditions on one column

我试图创建一个查询,只输出成员,如果他们满足2个条件。

第一个条件:如果用户有一个匹配的"courseID"

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

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

我有两张表…

  • ID

认证

  • ID
  • memberID
  • courseID

当会员完成一门课程时,他们获得认证。证书存储他们的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
;

或者,您可以将certs连接到certs的成员,这个可能更快:

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
;

试试这个…得到你需要的,拿走你不需要的。

SELECT *
FROM $memberTable
LEFT JOIN $certificationsTable USING (ID)
WHERE courseID = 4
AND ID NOT IN (
    SELECT ID
    FROM $memberTable
    LEFT JOIN $certificationsTable USING (ID)
    WHERE courseID = 5
)