【问题标题】:3 Conditions + Random Order + Pagination (Code Igniter + MySQL)3个条件+随机顺序+分页(Code Igniter + MySQL)
【发布时间】:2013-10-04 22:45:32
【问题描述】:

我有一个棘手的问题要解决,让我看看你能不能帮我...

我正在使用 CodeIgniter + MySQL 开发服务目录,并且由于我客户的业务规则,有 3 种计划类型。 (白金、黄金和白银 - 按从好到坏的顺序排列)

目录中有一张表,其中列出了要宣传的公司,每个公司都可能支付这 3 个计划中的一个。

问题是:

我必须按照以下规则呈现结果: 1. 铂先于黄金,再于白银 2.每个结果范围本身必须是随机的

Platinum 2
Platinum 1 
Platinum 3 
Gold 3 
Gold 1
GOld 2
Silver 2 
Silver 3
Silver 1

刷新,我得到:

Platinum 1
Platinum 3 
Platinum 2 
Gold 2 
Gold 1
GOld 3
Silver 2 
Silver 1
Silver 3

php中的查询是这样的:

// after a Select and several joins to filter city, provinces, service types
// i do this to randomize , order and group

        $query = $this->db->order_by('plan.level', 'desc');
        $query = $this->db->order_by('busines.id', 'random');

        $query = $this->db->group_by('business.id'); 
                return $query->result_array();

到目前为止,一切都很好。 问题是,有这么多结果,我必须对它们进行分页:) 我该如何做到这一点,请记住:

  • 各个页面的计划优先级必须相同
  • 结果必须在计划“块”内是随机的
  • 但分页不能通过页面重复记录或遗漏一些结果

我必须实现这样的目标(例如,每页分页 4 个)

Page I:
Platinum 1
Platinum 4
Platinum 5
Platinum 3

Page II:
Platinum 2
Gold 5
Gold 3
Gold 1

Page III:
Gold 4
Gold 2
Silver 2
Silver 5

Page IV:
Silver 1
Silver 3
Silver 4

在这个例子中,刷新,随机改变记录在计划块内的位置,在页面内,没有重复或遗漏的结果。

请有人帮助我。 这是一个挑战;)谢谢,阿德里亚诺。

【问题讨论】:

    标签: php mysql codeigniter pagination


    【解决方案1】:

    既然结果的随机化必须跨会话保存(用于分页),为什么不存储在 PHP 中而不是 MySQL 中?

    在 MySQL 中获取随机查询的初始查询:

    $this->db->select('id');
    // The rest of your ActiveRecord query here, randomized
    

    也许将 ID 存储在 PHP 中:

    $this->session->set_userdata('random_query', $array_of_random_ids);
    

    然后逐页查询

    $array_of_random_ids = $this->session->userdata('random_query');
    $this->db->from('business');
    $this->db->where_in('id', array_slice($array_of_random_ids, $page_number * $length, $views_per_page);
    $this->db->limit($views_per_page, $page_number * $length);
    

    当然,稍后再重置会话,如果您选择这样做的话。

    【讨论】:

    • 感谢您的努力,但我们正在谈论许多记录。它不适合会话。而且,考虑到性能问题,你的角度帮不了我。但是,非常感谢您的快速回答。让我们继续努力。如果您有其他想法,请告诉我。最好的问候。
    • @Adrianod'AvilaBorges 单独的 ID 不应该太多,我们在这里谈论多少?请记住,过早的优化是万恶之源。
    • 5000 导致启用所有省份和服务类型的场景。标准过滤器着陆从启用所有结果开始。
    猜你喜欢
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    相关资源
    最近更新 更多