MYSQL:多个"矛盾"一栏

时间:2015-07-07 23:15:13

标签: php mysql wordpress

我尝试创建一个仅在满足2个条件时才输出成员的查询。

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

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

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

我有两张桌子......

成员信息

  • ID
  • 电子邮件

认证

  • ID
  • MEMBERID
  • courseID

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

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

我们说我们有两门课程。 "初学者"(courseID = 1)和"中级"(courseID = 2)。

一名成员可以同时拥有两种认证,每种课程一种。另一个成员可能只有一个,#34;初学者"认证。

我想向所有拥有"初学者"认证。但是我希望排除任何成员使用"中级"认证。

我似乎无法克服的问题是如何使用" Intermediate"认证。

**我简化了这个例子,实际上有大量不同的认证类型**

以下是我一直在尝试的粗略查询...我已经尝试过这么多不同的查询。

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

// 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
");

2 个答案:

答案 0 :(得分:0)

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
;

答案 1 :(得分:0)

试试这个..得到你需要的东西,带走你不需要的东西..

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
)