Mysql один запрос из четырех таблиц

244
19 марта 2018, 23:15

Пишу систему подсчета и перераспределения трафика.

В базе(mysql) имеются таблицы sites, ins, outs, clicks.

Таблица sites иммет поля id и domain

Таблицы ins outs clicks имеют поля site_id created

Возможно ли одним запросом получить все данные из таблицы sites + получить количество ins, outs, clicks, созданные за последние 3600 и 86400 секунд, принадлежащие каждому из сайтов?

Answer 1

Мне кажется проще будет использовать подзапросы с выборкой количества

Основной запрос:

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, вы знаете что делать

READ ALSO
Агрегаты в elasticsearch против агрегирующих функций в реляционных бд

Агрегаты в elasticsearch против агрегирующих функций в реляционных бд

Наткнулся в одном видео на пример, когда количество товаров в категориях для меню доставалось из elasticsearch:

194
Пробелы в MySql запросах

Пробелы в MySql запросах

Пробелы в MySql запросах

176
Неверные данные? Баг C# или я что-то упустил?

Неверные данные? Баг C# или я что-то упустил?

Есть двойной цикл for с проверкой внутри на совпадение с заранее добытым массивом id

189
WPF проблема со 2 формой

WPF проблема со 2 формой

Добавил вторую форму, подскажите, как в файле Appxaml добавить стиль на вторую форму? P

238