Но нельзя сказать, что я здесь не получаю скилла.
Фиг бы я полгода назад написал вот такое:
Или провести вручную выборку нескольких разных типов событий из базы (отдельными несвязанными запросами), и вручную их раскладывать в порядке поступления. Час или два думал, но придумал. Делаем хэш со ссылками на события по датам, выбираем из базы только событие того типа, которого нет в хэше, тут же его добавляем туда, записываем в выходной поток событие с минимальной датой (сортировка по ключам хэша, выбор первого), удаляем это событие из хэша. Всё. Красота, блин!
Фиг бы я полгода назад написал вот такое:
SELECT
sel.inserted as login,
MAX(stats.inserted) as logout, e.name||' ('||sel.aext||')' as name,
MAX(stats.inserted)-sel.inserted as dura
FROM
stats RIGHT JOIN
(SELECT MAX(inserted) as inserted, aext FROM stats WHERE anum='LOG IN' GROUP BY aext ORDER BY inserted DESC) sel
ON (sel.aext=stats.aext AND stats.inserted>sel.inserted AND stats.anum='LOG OUT')
INNER JOIN employees e
ON sel.aext=e.intercom
GROUP BY sel.aext, sel.inserted, name
ORDER BY logout DESC, login DESC;Syhi-подсветка кода
sel.inserted as login,
MAX(stats.inserted) as logout, e.name||' ('||sel.aext||')' as name,
MAX(stats.inserted)-sel.inserted as dura
FROM
stats RIGHT JOIN
(SELECT MAX(inserted) as inserted, aext FROM stats WHERE anum='LOG IN' GROUP BY aext ORDER BY inserted DESC) sel
ON (sel.aext=stats.aext AND stats.inserted>sel.inserted AND stats.anum='LOG OUT')
INNER JOIN employees e
ON sel.aext=e.intercom
GROUP BY sel.aext, sel.inserted, name
ORDER BY logout DESC, login DESC;Syhi-подсветка кода
Или провести вручную выборку нескольких разных типов событий из базы (отдельными несвязанными запросами), и вручную их раскладывать в порядке поступления. Час или два думал, но придумал. Делаем хэш со ссылками на события по датам, выбираем из базы только событие того типа, которого нет в хэше, тут же его добавляем туда, записываем в выходной поток событие с минимальной датой (сортировка по ключам хэша, выбор первого), удаляем это событие из хэша. Всё. Красота, блин!
FILL_DATA: {
if (defined $ref_needed && $last_inserted!=$ref_needed)
{
$ref_needed=process_needed ($sth_needed->fetchrow_hashref()) if defined $ref_needed;
$triple{$ref_needed->{'inserted'}}=$ref_needed if defined $ref_needed;
}
if (defined $ref_na1 && $last_inserted!=$ref_na1)
{
$ref_na1=process_needed ($sth_needed->fetchrow_hashref()) if defined $ref_na1;
$triple{$ref_na1->{'inserted'}}=$ref_na1 if defined $ref_na1;
}
if (defined $ref_na2 && $last_inserted!=$ref_na2)
{
$ref_na2=process_needed (&get_next_na2($sth_na2)) if defined $ref_needed;
$triple{$ref_na2>{'inserted'}}=$ref_na2 if defined $ref_na2;
}
$last_inserted=(sort {$a<=>$b} keys %triple)[0];
delete $triple{$last_inserted};
push @data, {%$last_inserted};
} #FILL_DATA ENDSyhi-подсветка кода