Mysql Выбрать количество совпадающих записей по одному из столбцов

Эдди

Новичок
Помогите с запросом.
Есть две таблицы:
- Источники рекламы (таблица advert)
- Сколько cтрок advert_id содержится по каждому из источников рекламы в таблице advert_result
Таблицы связаны по полю advert_id
Это полбеды. Это делаю.
Надо, чтобы в отчете можно было изменять промежуток времени, за который хочешь посмотреть отчет.

Вот этот запрос выводит нормально все без указания дат:
Код:
SELECT `advert`, count(r.advert_id) AS `num` FROM `" . DB_PREFIX . "advert` a LEFT JOIN `" . DB_PREFIX . "advert_result` r USING (`advert_id`) WHERE r.advert_id = a.advert_id group BY `advert`
LEFT JOIN здесь, честно говоря, ни к селу, ни к городу.
Хотелось вывести все источники рекламы, даже если по ним нет строк в таблице. Ну да ладно с этим.
Просто если добавить диапазон дат, то запрос не работает, естественно.
 

Эдди

Новичок
WHERE date BETWEEN start AND end
Использую не between, а date >= AND date <=.
Выдает пустой результат. Без дат все нормально выводит.

Если запрос, который я выложил, дополнить date >= или же between должно работать, то я сам покопаюсь, что у меня не так. Главное понять, что так должно работать. Или не должно.

Честно скажу, у меня с group by не заладилось с самого начала.
 

AnrDaemon

Продвинутый новичок
Ты же понимаешь, что не видя твоих данных, невозможно что-то сказать?…
 

Эдди

Новичок
Вот две таблицы. Мне быстрее сфотошопить, чем писать.
Первая - все доступные источники рекламы.
Вторая, какой клиент кликнул на тот или ином источнике рекламы.
 

Вложения

Эдди

Новичок
Запрос должен выводить количество каждой отличающейся от других записей advert_id из второй таблицы.
Как я уже говорил, мой запрос работает. Но если задать любые даты, даже с Рождения Христова и до Апокалипсиса, выдает ноль строк.

Без периода дат получаю.
Поисковик Google - 2
Instagram - 1
Ярмарка мастеров - 1
 

AnrDaemon

Продвинутый новичок
'… WHERE UNIX_TIMESTAMP(date_added) BETWEEN ? AND ?', [strtotime('1 month ago'), time()]
 

Эдди

Новичок
В общем, с датами разобрался. Вчера переработал и не туда тыкал.

Остался последний вопрос.
Если период не задаю
Код:
SELECT `advert`, count(r.advert_id) AS `num` FROM `oc_advert` a LEFT JOIN `oc_advert_result` r USING (`advert_id`) WHERE 1=1 GROUP BY `advert` ORDER BY `sort`
то получаю (ЭТО ИМЕННО ТО, ЧТО НУЖНО):

Поисковик Яндекс - 0
Поисковик Google - 2
Instagram - 1
Ярмарка мастеров - 1
Рекомендация - 0
Другое - 0

Если задаю период
Код:
SELECT `advert`, count(r.advert_id) AS `num` FROM `oc_advert` a LEFT JOIN `oc_advert_result` r USING (`advert_id`) WHERE `date_added` BETWEEN "2016-01-01" AND "2018-01-01"   group BY `advert` ORDER BY `sort`
то нулевые записи не выводятся, что не очень меня устраивает.

Поисковик Google - 2
Instagram - 1
Ярмарка мастеров - 1

Можно ли как-нибудь изменить запрос, чтобы даже при задании периода выводились также и нулевые значения?

Спасибо
 

AnrDaemon

Продвинутый новичок
Начать с того, что ты не из той таблицы данные берёшь.
Ты считаешь результаты, а выбираешь из рекламы. Где логика?
Ну и потом, получить нужные тебе данные можно, емли поджойнить результаты ещё раз на oc_advert .
 

Эдди

Новичок
AnrDaemon
Смысл запроса:
ВАБРАТЬ ВСЕ ЗАПИСИ ИЗ ТАБЛИЦЫ advert (источники рекламы) и (ЕСЛИ ЕСТЬ) КОЛИЧЕСТВО СОВПАДАЮЩИХ ЗАПИСЕЙ ИЗ ТАБЛИЦЫ advert_result ОБЪЕДИНЕННЫХ ПО СТОЛБЦУ advert_id ЗА ОПРЕДЕЛЕННЫЙ ПЕРИОД.
 

Эдди

Новичок
Вот этот вложенный запрос работает так, как мне надо.
Нужно ли его упрощать? Важно ваше мнение.
Код:
SELECT `advert`, count(r.advert_id) FROM `oc_advert` a LEFT JOIN (SELECT `advert_id` FROM `oc_advert_result` WHERE DATE(`date_added`) >= '2017-05-01' AND DATE(`date_added`) <= '2017-05-29') r USING(`advert_id`) GROUP BY `advert`
 
Сверху