Count() из трех таблиц с разными условиями, одним запросом

298
22 августа 2017, 12:28

Имеем три таблицы pictures, movies, stories. Каждая таблица имеет одинаковые столбцы status, created_at.

status бывает трех видов: active, pending, deleted

Необходимо одним запросом получить кол-во строк созданные за последний час и за последние 24 часа. Наглядно это должно выглядеть примерно так:

----------------------------------------------------
|Status |Pics1h|Pics24h|Mov1h|Mov24h|Stor1h|Stor24h|
----------------------------------------------------
|active | 12   | 30    | 8   | 14   | 20   | 31    |
----------------------------------------------------
|pending|  2   |  4    | 1   | 4    | 2    | 8     |
----------------------------------------------------
|deleted| 10   | 34    | 2   | 45   | 33   | 45    |
----------------------------------------------------

Один столбец я умею вывести, например:

SELECT status, count(*) as `Pics1h`
FROM pictures
WHERE (created_at >= DATE_SUB(NOW(), INTERVAL 60 MINUTE))
GROUP BY status;

Как получить данные из трех таблиц, возможно и несколькими запросами, но максимально эффективно?

Answer 1
select status,
       sum(Pics1h) Pics1h, sum(Pics24h) Pics24h,
       sum(Mov1h) Mov1h, sum(Mov24h) Mov24h,
       sum(Stor1h) Stor1h, sum(Stor24h) Stor24h
  from (
        SELECT status, sum(created_at >= NOW()-INTERVAL 60 MINUTE) Pics1h, count(1) Pics24h,
               NULL Mov1h, NULL Mov24h, NULL Stor1h, NULL Stor24h
          FROM pictures
         WHERE created_at >= NOW()-INTERVAL 1 DAY
         GROUP BY status
      UNION ALL
        SELECT status, NULL, NULL,
               sum(created_at >= NOW()-INTERVAL 60 MINUTE), count(1),
               NULL, NULL
          FROM Mov
         WHERE created_at >= NOW()-INTERVAL 1 DAY
         GROUP BY status
      UNION ALL
        SELECT status, NULL, NULL, NULL, NULL,
               sum(created_at >= NOW()-INTERVAL 60 MINUTE), count(1)
          FROM Stor
         WHERE created_at >= NOW()-INTERVAL 1 DAY
         GROUP BY status
      UNION ALL SELECT 'active', 0,0,0,0,0,0
      UNION ALL SELECT 'pending', 0,0,0,0,0,0
      UNION ALL SELECT 'deleted', 0,0,0,0,0,0
   ) A
  GROUP BY status

UPD Последние три UNION для того, что бы все строки точно были в результате. Нули можно заменить на NULL, в зависимости от желаемого результата.

READ ALSO
Тип веб сервиса

Тип веб сервиса

Есть веб-сервис, а точнее сервлет, который принимает только HTTP POST запросыURL обращения к сервису один и представляет из себя ссылку на сервлет,...

313
Дважды выполняется метод close (FileInputStre

Дважды выполняется метод close (FileInputStre

Это содержание выходного файла:

297
Перенос jar-приложения в war

Перенос jar-приложения в war

Мне нужно реализовать редактирование properties и вывод логов на веб-страницу

288
Редактирование TableView

Редактирование TableView

Хочу сделать так, чтобы можно было редактировать данные прямо в таблицеНо при вызове методы setOnEditCommit для обоих столбцов пишет: неверный параметр...

368