错误使用内连接功能/组功能?

时间:2013-12-19 21:43:48

标签: mysql sql

我的查询存在以下问题:

我有两张桌子:

  1. 客户
  2. 订户
  3. 由customer.id = subscriber.customer_id

    链接在一起 订阅者表中的

    ,我有id_customer = 0的记录(这些是电子邮件记录,没有完整的客户帐户)

    现在我要展示我每天有多少客户,以及有多少订阅者id_customer,以及有多少订阅者id_customer = 0(我称之为电子邮件)

    不知何故,我无法获得这些电子邮件。 也许它与不使用正确的连接类型有关。 当我使用左连接时,我获得了适量的客户,但没有适当数量的电子邮件。当我使用内部联接时,我得到了错误的客户数量。我正确使用群组功能吗?我认为这与此有关。

    这是我的查询:

       `   SELECT DATE(c.date_register),
    COUNT(DISTINCT c.id) AS newcustomers,
    COUNT(DISTINCT s.customer_id) AS newsubscribedcustomers,
    COUNT(DISTINCT s.subscriber_id AND s.customer_id=0) AS emailonlies
    FROM customer c
    LEFT JOIN subscriber s ON s.customer_id=c.id
    GROUP BY DATE(c.date_register)
    ORDER BY DATE(c.date_register) DESC
    LIMIT 10
    ;`
    

2 个答案:

答案 0 :(得分:0)

我不完全确定,但我认为在DISTINCT s.subscriber_id AND s.customer_id=0中,它会在AND之前运行DISTINCT,因此DISTINCT只会看到真假。

你为什么不采取

COUNT(DISTINCT s.subscriber_id) - (COUNT(DISTINCT s.customer_id) - 1)?

(-1是因为DISTINCT s.customer_id将计为0。)

答案 1 :(得分:0)

知道了,唯一的风险就是如果当天没有客户我没有收到电子邮件,因为左边的加入。但是这个有效:

SELECT customers.regdatum,customers.customersqty,subscribers.emailonlies

FROM(     (SELECT DATE(c.date_register)AS regdatum,COUNT(DISTINCT c.id)AS customersqty     来自客户c     GROUP BY DATE(c.date_register)     )AS客户

LEFT JOIN

(SELECT DATE(s.added) AS voegdatum,COUNT(DISTINCT s.subscriber_id) AS emailonlies
FROM subscriber s
WHERE s.customer_id=0
GROUP BY DATE(s.added)
) AS subscribers

ON customers.regdatum = subscribers.voegdatum     ) ORDER BY customers.regdatum DESC ;