【问题标题】:Why isn't Rose::DB::Object sort_by RAND() doing what I expect?为什么 Rose::DB::Object sort_by RAND() 不按我的预期做?
【发布时间】:2009-07-30 02:25:43
【问题描述】:

我无法让它工作。我正在使用这个查询:

my $user_questions 
    = RoseDB::UserSecurityQuestion::Manager->get_user_security_questions(
        query        => [
                          'user.username' => $username,
                        ],
        with_objects => ['User','SecurityQuestion'],
        sort_by      => 'RAND()',
        limit        => 2,
    );

当我在 Rose::DB::Object::Manager 中打开调试时,我看到 order 子句是:

ORDER BY t1.id, RAND()

t1.id 来自哪里?知道如何将ORDER BY 改正为RAND()

【问题讨论】:

    标签: perl rose-db-object


    【解决方案1】:

    来自documentation for the sort_by parameter

    如果选择通过“一对多”或“多对多”关系关联的子对象(通过 require_objects 或 with_objects),排序顺序子句中的第一个条件必须是主表中的列 (t1) .如果不满足此条件,则主键列的列表将自动添加到排序顺序子句的开头。

    这是将子对象与其父对象正确关联所必需的。

    如果您想覆盖此行为,可以使用(尚未记录的)no_forced_sort 布尔参数。

    my $user_questions =
      RoseDB::UserSecurityQuestion::Manager->get_user_security_questions(
        ...
        sort_by        => 'RAND()',
        no_forced_sort => 1);
    

    但是这很可能会导致子对象与不正确的父对象关联。完成这项工作需要的是一种确定性地基于 t1 的独特特征的排序,但在其他方面是随机的。也就是说,somefunc(t1.id) 将是随机的,但对于给定的 t1.id 值,总是会返回相同的结果,从而使所有孩子都拥有正确的父母。

    一个明显(可能更实用)的方法是为用户$username 获取所有安全问题,然后随机选择两个:

    my $user_questions =
      RoseDB::UserSecurityQuestion::Manager->get_user_security_questions(
        query        => [ 'user.username' => $username ],
        with_objects => ['User','SecurityQuestion']);
    
    use constant NUM_RANDOM_QUESTIONS => 2;
    
    my @questions;
    
    for(1 .. NUM_RANDOM_QUESTIONS)
    {
      last unless(@$user_questions);
      push(@questions, splice(@$user_questions, int(rand(@$user_questions)), 1));
    }
    

    现在您在@questions 中获得了(最多)NUM_RANDOM_QUESTIONS 随机选择的问题。

    【讨论】:

    • 谢谢约翰。我越深入研究你的作品,我就越欣赏它。由于最多有 5 个问题,我认为这种方法在这种情况下是可以接受的。也许有一天我会完全掌握模块中的所有内容(尽管有很多工作要做:)
    猜你喜欢
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 2020-06-07
    相关资源
    最近更新 更多