Хотя я уверен, что это возможно для MySQL, вот решение для Postgres, использующее триггеры.
Счетчик хранится в другой таблице, и при каждой вставке / обновлении / удалении имеется триггер, который проверяет, соответствует ли новая строка условию (ам), и, если это так, добавляет 1 к счетчику.Другая часть триггера проверяет, соответствует ли старая строка условию (ам), и, если это так, вычитает 1.
Вот базовый код для триггера, который считает строки с temp2 = '5'
:
CREATE OR REPLACE FUNCTION updateCount() RETURNS TRIGGER AS
$func$
BEGIN
IF TG_OP = 'INSERT' OR TG_OP = 'UPDATE' THEN
EXECUTE 'UPDATE someTableCount SET cnt = cnt + 1 WHERE 1 = (SELECT 1 FROM (VALUES($1.*)) x(id, temp1, temp2, temp3) WHERE x.temp2 = ''5'')'
USING NEW;
END IF;
IF TG_OP = 'DELETE' OR TG_OP = 'UPDATE' THEN
EXECUTE 'UPDATE someTableCount SET cnt = cnt - 1 WHERE 1 = (SELECT 1 FROM (VALUES($1.*)) x(id, temp1, temp2, temp3) WHERE x.temp2 = ''5'')'
USING OLD;
END IF;
RETURN new;
END
$func$ LANGUAGE plpgsql;
Вот рабочий пример для dbfiddle .
Конечно, вы можете изменить код триггера, чтобы он был динамическим, где выражения и счетчики хранятся для каждого в таблице, например:
CREATE TABLE someTableCount
(
whereExpr text,
cnt INT
);
INSERT INTO someTableCount VALUES ('temp2 = ''5''', 0);
В триггере вы затем выполните цикл по условиям и обновите соответственно.