Непонятный вывод Mysql
Eсть две таблицы:
CREATE TABLE admin_ad.event (
id int(11) NOT NULL AUTO_INCREMENT,
cid varchar(255) NOT NULL COMMENT 'click_id',
c_id int(11) NOT NULL COMMENT 'campaign_id',
date date NOT NULL,
PRIMARY KEY (id)
)
ENGINE = INNODB,
AUTO_INCREMENT = 32272,
AVG_ROW_LENGTH = 50,
CHARACTER SET utf8,
COLLATE utf8_general_ci;
и
CREATE TABLE admin_ad.postback (
id int(11) NOT NULL AUTO_INCREMENT,
c_id varchar(255) NOT NULL COMMENT 'click_id',
cid int(11) NOT NULL COMMENT 'campaign_id',
u_id int(11) NOT NULL,
date date NOT NULL,
PRIMARY KEY (id)
)
ENGINE = INNODB,
AUTO_INCREMENT = 17,
AVG_ROW_LENGTH = 3276,
CHARACTER SET utf8,
COLLATE utf8_general_ci;
В первой хранится чуть больше 30к записей, а во второй - всего 1.
Пишу вот такой запрос:
SELECT
e.date AS date,
COUNT(e.cid) AS count,
COUNT(p.cid) AS count_postback
FROM
event e
LEFT JOIN
postback p
ON p.cid = e.c_id
WHERE
e.c_id = '44'
AND DATE(e.date) BETWEEN '2020-06-29' AND '2020-07-01'
GROUP BY
e.date
И ожидаю, что мне выведется вот такое:
date count count_postback
2020-06-29 3 0
2020-06-30 623 0
2020-07-01 653 1
А выводится вот такое:
date count count_postback
2020-06-29 3 3
2020-06-30 623 623
2020-07-01 653 653
Вопрос заключается в том, откуда (и почему?) в count_postback выводятся такие же значение, как и в count, хотя в таблице postback всего одна запись?
Версия сервера: MySQL 5.7.28
INSERT INTO
Пока пытаюсь сделать всё на sqlfiddle.com, добавлю сюда
Postback:
INSERT INTO postback (id, c_id, cid, u_id, date) VALUES (NULL, 12, 44, '2020-07-01');
Event:
INSERT INTO event (id, cid, c_id, date) VALUES (NULL, 44, '135224', '2020-06-29');
INSERT INTO event (id, cid, c_id, date) VALUES (NULL, 44, '135748', '2020-06-29');
INSERT INTO event (id, cid, c_id, date) VALUES (NULL, 44, '135487', '2020-06-30');
INSERT INTO event (id, cid, c_id, date) VALUES (NULL, 44, '135284', '2020-06-30');
INSERT INTO event (id, cid, c_id, date) VALUES (NULL, 44, '135997', '2020-07-01');
Ответы (1 шт):
Если данные в вопросе совпадают с реальными данными, то запрос работает абсолютно корректно, т.к. в таблице event есть 5 записей с id=44 и все они соединяются с одной записью в таблице postback
Для того, чтобы увидеть это - сделайте запрос ниже:
SELECT *
FROM
event e
LEFT JOIN
postback p
ON p.cid = e.cid
WHERE
e.cid = '44'
AND DATE(e.date) BETWEEN '2020-06-29' AND '2020-07-01'
В результате вы получите таблицу ниже, где нет Null значений, т.к. все записи удалось соединить
id cid c_id date id c_id cid u_id date
32272 44 135224 2020-06-29 17 12 44 44 2020-07-01
32273 44 135748 2020-06-29 17 12 44 44 2020-07-01
32274 44 135487 2020-06-30 17 12 44 44 2020-07-01
32275 44 135284 2020-06-30 17 12 44 44 2020-07-01
32276 44 135997 2020-07-01 17 12 44 44 2020-07-01
П.С. Чтобы запрос заработал как вам нужно - используйте COUNT(distinct p.cid)