2013-12-19 3 views
0

я следующая проблема с моим запросом:Неправильное использование функции внутреннего соединения/групповой функции?

У меня есть две таблицы:

  1. клиентов
  2. Subscriber

связаны между собой customer.id = subscriber.customer_id

в таблице подписчиков, у меня есть записи с id_customer = 0 (это записи электронной почты, у которых нет полной учетной записи клиента)

Теперь я хочу, чтобы показать, сколько клиентов у меня есть в день, и сколько абонентов с id_customer, и сколько абонентов с id_customer = 0 (emailonlies я называю их)

каким-то образом, я не могу управлять, чтобы получить те emailonlies. Возможно, это связано с тем, что вы не используете правильный тип соединения. Когда я использую левое соединение, я получаю нужное количество клиентов, но не правильное количество emailonlies. Когда я использую внутреннее соединение, я получаю неправильное количество клиентов. Правильно ли я использую групповую функцию? Я думаю, что это как-то связано с этим.

ЭТО МОЙ ЗАПРОС:

` 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 
;` 
+0

В подписчике вы ищете 'id_customer = 0' или' customer_id = 0', чтобы определить emailonlies? – AgRizzo

ответ

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.)

0

Понял, только риск того, что я не получаю по электронной почте onlies если есть нет клиентов в этот день, из-за левого соединения. Но это работает:

ВЫБРАТЬ customers.regdatum, customers.customersqty, subscribers.emailonlies

FROM ( (SELECT DATE (c.date_register) AS regdatum, COUNT (DISTINCT c.id) AS customersqty ОТ клиент с GROUP BY DATE (c.date_register) ) КАК клиентов

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 абонента s.voegdatum ) ORDER BY customers.regdatum DESC ;

Смежные вопросы