Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mysql嵌套select语句上卡住_Mysql_Sql - Fatal编程技术网

在mysql嵌套select语句上卡住

在mysql嵌套select语句上卡住,mysql,sql,Mysql,Sql,我在select语句中加入了三个表: 表CRM_联系人结构: CONTACTS_ID, CONTACTS_EMAIL 1 email@email.com 2 email2@email.com PRODUCTS_ID, PRODUCTS_NAME, PRODUCTS_TYPE 204 Sample free_sample 205 beginners_1 monthly_subscription

我在select语句中加入了三个表:

表CRM_联系人结构:

CONTACTS_ID, CONTACTS_EMAIL
1            email@email.com
2            email2@email.com
PRODUCTS_ID, PRODUCTS_NAME, PRODUCTS_TYPE
204          Sample         free_sample
205          beginners_1    monthly_subscription
206          beginners_2    monthly_subscription  
表CRM_产品结构:

CONTACTS_ID, CONTACTS_EMAIL
1            email@email.com
2            email2@email.com
PRODUCTS_ID, PRODUCTS_NAME, PRODUCTS_TYPE
204          Sample         free_sample
205          beginners_1    monthly_subscription
206          beginners_2    monthly_subscription  
表CRM\u产品\u采购:

ID, CONTACTS_ID, PRODUCTS_ID
3   1            204
4   1            205
5   2            204
因此,客户当然可以购买多种产品

我想做一个select声明,选择购买产品\ ID 204(免费样品)的所有客户,但如果他们购买了产品\类型=每月\订阅的产品,我不希望他们出现在我的结果中

因此,我希望得到的预期输出是与CONTACTS_ID 2的联系人

我对sql语句非常陌生。到目前为止,我得到的是:

    SELECT CRM_PRODUCTS_PURCHASE.CONTACTS_ID,CRM_PRODUCTS_PURCHASE.PRODUCTS_ID, CRM_CONTACTS.CONTACTS_EMAIL, CRM_CONTACTS.CONTACTS_LANGUAGE
FROM CRM_PRODUCTS_PURCHASE
LEFT JOIN CRM_CONTACTS ON CRM_PRODUCTS_PURCHASE.CONTACTS_ID = CRM_CONTACTS.ID
LEFT JOIN CRM_PRODUCTS ON CRM_PRODUCTS_PURCHASE.PRODUCTS_ID = CRM_PRODUCTS.ID
WHERE CRM_PRODUCTS_PURCHASE.CONTACTS_ID IN 
(SELECT CRM_CONTACTS.ID
    FROM CRM_PRODUCTS_PURCHASE
        LEFT JOIN CRM_CONTACTS ON CRM_PRODUCTS_PURCHASE.CONTACTS_ID = CRM_CONTACTS.ID
        LEFT JOIN CRM_PRODUCTS ON CRM_PRODUCTS_PURCHASE.PRODUCTS_ID = CRM_PRODUCTS.ID
    WHERE CRM_PRODUCTS_PURCHASE.PRODUCTS_ID = 204 AND
        CRM_CONTACTS.CONTACTS_EMAIL!='' AND
        NOT coalesce(CRM_CONTACTS.CONTACTS_DEACTIVATED,0)
        GROUP BY CRM_CONTACTS.CONTACTS_EMAIL
        ORDER BY CRM_CONTACTS.CONTACTS_LANGUAGE)

首先,您提到了“按CRM订购”联系人。联系人语言不在
选择
语句。如何在返回单列的子查询中使用“分组依据”

(SELECT CRM_CONTACTS.ID
    FROM CRM_PRODUCTS_PURCHASE
        LEFT JOIN CRM_CONTACTS ON CRM_PRODUCTS_PURCHASE.CONTACTS_ID = CRM_CONTACTS.ID
        LEFT JOIN CRM_PRODUCTS ON CRM_PRODUCTS_PURCHASE.PRODUCTS_ID = CRM_PRODUCTS.ID
    WHERE CRM_PRODUCTS_PURCHASE.PRODUCTS_ID = 204 AND
        CRM_CONTACTS.CONTACTS_EMAIL!='' AND
        NOT coalesce(CRM_CONTACTS.CONTACTS_DEACTIVATED,0)
        GROUP BY CRM_CONTACTS.CONTACTS_EMAIL
        ORDER BY CRM_CONTACTS.CONTACTS_LANGUAGE)

您应该尽可能避免嵌套子选择,因为MySQL内部优化程序很难使用这些子选择,因此会生成非常慢的查询。在许多情况下,创建一个包含子选择数据的临时表并将其连接起来通常比创建子选择要好,但这是一种非常有条件的做法

但是,有时您需要这样做,在这些情况下,请尝试保持子选择尽可能简单

SELECT *
FROM CRM_PRODUCTS_PURCHASE
   # Do other joins 
WHERE
    CRM_PRODUCTS_PURCHASE.CONTACTS_ID NOT IN (
        SELECT CONTACTS_ID
        FROM CRM_PRODUCTS_PURCHASE
        WHERE
            CRM_PRODUCTS_PURCHASE.PRODUCTS_ID IN (205, 206))
    AND CRM_PRODUCTS_PURCHASE.PRODUCTS_ID = 204
;
-以上是未经检验的

注意:子选择中的“订购依据”通常不起作用。把订单留到最后


在我们的实际案例中,我们经常发现将上述两个查询作为两个查询来运行要好几个数量级。i、 e.生成联系人ID列表,并将值存储在PHP变量中,然后进行第二次查询,使用NOT in子句中的那些值。

您的查询中是否有
NOT coalesce
?让我们在表中获取一些示例数据,以供我们查看以及预期输出。我使用NOT coalesce,因为在我的DBI中,停用的联系人可以是0或Null。我没有提到联系人语言,因为它不是输出的真正重要性。群组是必要的,因为多个联系人可以有相同的电子邮件地址,我只想向他们发送一次电子邮件。