Причина, по которой размер вашего указателя составляет 4 байта, заключается в том, что вы компилируете 32-битную архитектуру. Как отметил FryGuy, в 64-битной архитектуре вы увидите 8.
Таблица: ОБНОВЛЕНО # 3 - Объединяет ли это все это?
Вы создаете для каждой строки фиктивный столбец с именем type
, применяя необходимое условие,
со значением 0 или 1 и суммируя по нему:
select t.username, sum(t.type) num_of_signed_docs from (
select a.username,
case
when event = 'reject' then 0
when exists
(select 1 from audit where doc_id = a.doc_id and
datetime > a.datetime and event = 'reject')
then 0
else 1 end as type
from audit a
) t
group by t.username
См. демо для SQL Server
и демо для MySQL
Редактировать
[ 1111]
select a.username, count(distinct a.doc_id) num_of_signed_docs
from audit a
where
a.event = 'sign'
and
not exists (
select 1 from audit where
doc_id = a.doc_id and datetime > a.datetime and event = 'reject'
)
group by a.username
Это то, что вы хотите?
select user, sum(case when event = 'sign' then 1 else 0 end) as num_signs
from audittable
group by user;
Извините, если есть опечатки. Я не могу проверить орфографию. Но моя идея состоит в том, чтобы получить последний идентификатор записи с событием отклонения и выполнить манипуляции с остальной таблицей. Для оптимизации запроса вы можете сохранить этот идентификатор в переменной.
SELECT user, COUNT(event = 'sign') AS `num_of_signed_docs`
FROM audittable
WHERE `id` > (SELECT `id` FROM audittable
WHERE `event` = 'reject'
ORDER BY `id` DESC LIMIT 1)
GROUP BY user;