Имеем три таблицы 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;
Как получить данные из трех таблиц, возможно и несколькими запросами, но максимально эффективно?
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, в зависимости от желаемого результата.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей