$c->stash->{routes} = [$c->model('QDB::Route')->search( { 'n_1.net_id' => $c->stash->{net_id}, }, { alias => 'rt', # alias columns in accordance with "from" from => [ { rt => 'vi_route' }, [ { n_1 => 'vi_nodes', -join_type => 'inner' }, { 'rt.route_beg' => 'n_1.node_id', 'rt.net_id' => 'n_1.net_id' } ], [ { n_2 => 'vi_nodes', -join_type => 'inner' }, { 'rt.route_end' => 'n_2.node_id', 'rt.net_id' => 'n_2.net_id' } ], ], 'select' => [ 'rt.route_beg', 'rt.route_end', \'n_1.node_name AS node_name_beg', \'n_2.node_name AS node_name_end', \'COUNT(rt.route_beg) as grp_count', ], 'as' => [ qw/ route_beg route_end node_name_beg node_name_end route_grp_count / ], 'group_by' => [qw/ rt.route_beg rt.route_end node_name_beg node_name_end /], }, )]; #### SELECT rt.route_beg, rt.route_end, n_1.node_name AS node_name_beg, n_2.node_name AS node_name_end, COUNT(rt.route_beg) as grp_count FROM vi_route rt INNER JOIN vi_nodes n_1 ON ( rt.net_id = n_1.net_id AND rt.route_beg = n_1.node_id ) INNER JOIN vi_nodes n_2 ON ( rt.net_id = n_2.net_id AND rt.route_end = n_2.node_id ) WHERE ( n_1.net_id = ? ) GROUP BY rt.route_beg, rt.route_end, n_1.node_name, n_2.node_name ORDER BY node_name_beg: 'param_value' #### page => 1, # page to return (defaults to 1) rows => 10, # number of results per page #### SELECT * FROM ( SELECT TOP 10 * FROM ( SELECT TOP 10 rt.route_beg, rt.route_end, n_1.node_name AS node_name_beg, n_2.node_name AS node_name_end, COUNT(rt.route_beg) as grp_count FROM vi_route rt INNER JOIN vi_nodes n_1 ON ( rt.net_id = n_1.net_id AND rt.route_beg = n_1.node_id ) INNER JOIN vi_nodes n_2 ON ( rt.net_id = n_2.net_id AND rt.route_end = n_2.node_id ) WHERE ( n_1.net_id = ? ) ORDER BY node_name_beg ASC ) AS foo #-- There must be GROUP BY CLAUSE but it's missed! --# ORDER BY node_name_beg DESC ) AS bar ORDER BY node_name_beg ASC : 'param_value'