Perl 按多列对数据库中的现有用户进行排序

Perl 按多列对数据库中的现有用户进行排序,perl,mojolicious,dbix-class,Perl,Mojolicious,Dbix Class,我使用了排序函数 sub sort_users { my $self = shift; return $self->search(undef, { order_by => [{ -desc => 'data_begin' }, { -asc => 'username' }]}); } 要根据开始日期筛选用户,如果按用户名排序相等,则数据库如下所示: user1 2019-09-26 00:00:00 user2 2019-09-26 00:00:00 u

我使用了排序函数

sub sort_users {
  my $self = shift;
  return $self->search(undef, { order_by => [{ -desc => 'data_begin' },
    { -asc => 'username' }]});
}
要根据开始日期筛选用户,如果按用户名排序相等,则数据库如下所示:

user1 2019-09-26 00:00:00
user2 2019-09-26 00:00:00
user3 2019-09-26 00:00:00
user4 2019-09-26 00:00:00
以下排序有时以以下模式显示用户

user2, user3, user1, user4
其他时间

user1, user2, user3, user4.

编辑

我使用
DBIC_TRACE=1运行,得到:

SELECT COUNT( * ) FROM user_access_rights me WHERE ( ( access_rights_id = ? AND date_end >= ? ) ): 'level1', '2019-10-28 07:43:30+0000'
SELECT access_rights_recipient.username, access_rights_recipient.last_login, me.access_rights_id FROM user_access_rights me  JOIN users access_rights_recipient ON access_rights_recipient.username = me.username WHERE ( ( access_rights_id = ? AND date_end >= ? ) ) ORDER BY date_begin DESC, username ASC LIMIT ?: 'level1', '2019-10-28 07:43:30+0000', '2'

INSERT INTO user_access_rights ( access_rights_id, date_begin, date_end, username) VALUES ( ?, ?, ?, ? ) RETURNING id: 'level1', '2019-10-28T07:43:29', '2019-10-29T07:43:29', 'user1'
INSERT INTO user_access_rights ( access_rights_id, date_begin, date_end, username) VALUES ( ?, ?, ?, ? ) RETURNING id: 'level1', '2019-10-28T07:43:29', '2019-10-29T07:43:29', 'user2'
INSERT INTO user_access_rights ( access_rights_id, date_begin, date_end, username) VALUES ( ?, ?, ?, ? ) RETURNING id: 'level1', '2019-10-28T07:43:29', '2019-10-29T07:43:29', 'user3'
INSERT INTO user_access_rights ( access_rights_id, date_begin, date_end, username) VALUES ( ?, ?, ?, ? ) RETURNING id: 'level1', '2019-10-28T07:43:29', '2019-10-29T07:43:29', 'user4'
INSERT INTO user_access_rights ( access_rights_id, date_begin, date_end, username) VALUES ( ?, ?, ?, ? ) RETURNING id: 'level1', '2019-10-28T07:43:30', '2019-10-29T07:43:30', 'user5'
INSERT INTO user_access_rights ( access_rights_id, date_begin, date_end, username) VALUES ( ?, ?, ?, ? ) RETURNING id: 'level2', '2019-10-28T07:43:30', '2019-10-29T07:43:30', 'user6'
INSERT INTO user_access_rights ( access_rights_id, date_begin, date_end, username) VALUES ( ?, ?, ?, ? ) RETURNING id: 'level2', '2019-10-28T07:43:30', '2019-10-29T07:43:30', 'user7'
INSERT INTO user_access_rights ( access_rights_id, date_begin, date_end, username) VALUES ( ?, ?, ?, ? ) RETURNING id: 'level2', '2019-10-28T07:43:30', '2019-10-29T07:43:30', 'user8'
INSERT INTO user_access_rights ( access_rights_id, date_begin, date_end, username) VALUES ( ?, ?, ?, ? ) RETURNING id: 'level2', '2019-10-28T07:43:30', '2019-10-29T07:43:30', 'user9'
INSERT INTO user_access_rights ( access_rights_id, date_begin, date_end, username) VALUES ( ?, ?, ?, ? ) RETURNING id: 'level2', '2019-10-28T07:43:30', '2019-10-29T07:43:30', 'user10'
INSERT INTO user_access_rights ( access_rights_id, date_begin, date_end, username) VALUES ( ?, ?, ?, ? ) RETURNING id: 'level2', '2019-10-28T07:43:30', '2019-10-29T07:43:30', 'user11'

要求显示user1和user2,而不是显示user5和user1这是因为与具有级别1的用户相比,user5在数据库中添加的时间要晚一秒,因此它们按该顺序显示,因为它们是按数据按函数顺序降序排列的。\u begin.

请向我们展示输出有序用户名的代码,因为您的函数没有问题。这应该可以。。。您可以通过设置环境变量
DBIC_TRACE
export DBIC_TRACE=1
)来实现吗?然后可以在控制台或日志中检查SQL查询的文本。
orderby
子句是否始终相同?谢谢跟踪。您可以看到查询中的
orderby
子句与您的代码匹配:
orderby date\u begin DESC,username ASC
。您当时在代码中获得了正确顺序的结果吗?有时我得到了正确的答案,有时我没有,这是不可靠的。它必须显示user1和user2,但显示为user5和user1。此外,我还看到顺序by正常工作。