Пишу систему подсчета и перераспределения трафика.
В базе(mysql) имеются таблицы sites, ins, outs, clicks.
Таблица sites иммет поля id и domain
Таблицы ins outs clicks имеют поля site_id created
Возможно ли одним запросом получить все данные из таблицы sites + получить количество ins, outs, clicks, созданные за последние 3600 и 86400 секунд, принадлежащие каждому из сайтов?
Мне кажется проще будет использовать подзапросы с выборкой количества
Основной запрос:
SELECT `sites`.*,
(<SUB_SELECT>) AS `ins_count`,
(<SUB_SELECT>) AS `outs_count`,
(<SUB_SELECT>) AS `click_count`
FROM `sites`
WHERE 1;
Подзапрос <SUB_SELECT>, например для количества кликов за последние 3600 секунд:
SELECT COUNT(*) FROM `clicks`
WHERE `site_id` = `sites`.`id`
AND `created` BETWEEN UNIX_TIMESTAMP()-3600 AND UNIX_TIMESTAMP()
Специфика проверки времени "за последние 3600 секунд" зависит от формата поля created, оно может быть TIMESTAMP или INT или что-то еще, смотрите сами, как у вас
Полный запрос выглядит ужасно и не понятно, но я рискну его привести:
SELECT `sites`.*,
(
SELECT COUNT(*) FROM `ins`
WHERE `site_id` = `sites`.`id`
AND `created` BETWEEN UNIX_TIMESTAMP()-3600 AND UNIX_TIMESTAMP()
) AS `ins_count`,
(
SELECT COUNT(*) FROM `outs`
WHERE `site_id` = `sites`.`id`
AND `created` BETWEEN UNIX_TIMESTAMP()-3600 AND UNIX_TIMESTAMP()
) AS `outs_count`,
(
SELECT COUNT(*) FROM `clicks`
WHERE `site_id` = `sites`.`id`
AND `created` BETWEEN UNIX_TIMESTAMP()-3600 AND UNIX_TIMESTAMP()
) AS `click_count`
FROM `sites`
WHERE 1;
В итоге имеем в результате все поля sites и 3 дополнительные поля из подзапросов с количеством. Если нужно еще три поля с количеством за последние 86400, вы знаете что делать
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости