0

我有两个返回电话号码列的 mysql 查询。我想最终得到一个列表中的电话号码列表,但不在另一个列表中。

所以我有两个查询是:

SELECT phone
FROM civicrm_phone phone
LEFT JOIN civicrm_participant participant 
    ON phone.contact_id = participant.contact_id
WHERE phone.is_primary = 1
    AND participant.id IS NULL

SELECT phone
FROM civicrm_phone phone
LEFT JOIN civicrm_participant participant 
    ON phone.contact_id = participant.contact_id
WHERE phone.is_primary = 1
    AND participant.id IS NOT NULL

在有人问之前,上述两个查询并没有提供互斥的结果(基于最后一个 WHERE 语句使用 IS NULL 和 IS NOT NULL),因为我们在数据库中有使用相同电话号码的相关个人,但不必须都有一个参与者.id。

谢谢你的帮助。

4

1 回答 1

4

以下查询将第二个查询放在 WHERE 子句中进行比较:

SELECT phone
FROM civicrm_phone phone
LEFT JOIN civicrm_participant participant ON phone.contact_id = participant.contact_id
WHERE phone.is_primary = 1
AND participant.id IS NULL and
    not exists (SELECT 1
                FROM civicrm_phone phone2
                LEFT JOIN civicrm_participant participant ON phone2.contact_id = participant.contact_id
                WHERE phone.is_primary = 1
                      AND participant.id IS NULL
                      and phone2.phone = phone.phone
              )

通常在 SQL 中,您会为此使用 NOT IN,但带有相关子查询的 NOT EXISTS 在 MySQL 中更有效。

于 2012-09-14T15:40:17.953 回答