【问题标题】:Using Codeigniter, how to use get_where, but not include certain rows?使用 Codeigniter,如何使用 get_where,但不包含某些行?
【发布时间】:2013-11-20 08:03:05
【问题描述】:

我试图从数据库 6 中提取最新事件的函数。然后我想测试事件是否通过某个参数相互关联(我已经弄清楚了这个函数),但是想从数组中删除重复并添加下一个最近的事件。

例如,假设我有事件 #1-6。事件#3 与事件#1 相关。然后我想从数组中删除事件#3,然后添加到数组事件#7。完成后,我想检查事件 #1、2、4、5、6、7 以确保不再重复。我正在尝试继续这个过程,直到每个事件都是独一无二的。

这是我当前的代码:

public function get_user_events($limit=6, $offset= 0) 
    {
        $user = $this->ion_auth->user()->row();
        $event = $this->db->order_by("time_initiated","desc")
        ->get_where("events",array("user_id" => $user->id), $limit, $offset)
        ->result_array();
        $noduplicates = FALSE;
        while(!$noduplicates) {
        foreach ($event as $a) {
            if(test_if_repeated($a, $event)) { remove from array; $noduplicates = true } 
        }
        // somehow need to refresh the list to get that 7th element
        }
        return $event;
    }

【问题讨论】:

  • 您应该以这样一种方式存储事件之间的关系,以便您的关系数据库管理系统可以轻松确定哪些是“重复”的其他。那么此操作将涉及单个查询,并且不需要将不必要的数据昂贵地传输到 PHP 进行进一步检查,然后才被丢弃。
  • 目前我的数据库中有它,因此每个事件都有一个字段,其中包含上一个事件和下一个事件的 id,创建相关事件的链接列表。有什么方法可以帮助我,或者有什么其他方法可以建议您更改数据库?
  • 与其他一些 RDBMS 不同,MySQL 不支持递归函数 - 因此它不太适合用于存储分层数据的“邻接表”模型;请考虑“嵌套集”或“传递闭包”模型。
  • 这个问题只针对产品的一小部分,只需要在一个地方使用。完全改变数据库的结构会很不方便。您知道临时解决方法吗?
  • 您可以存储每个层次结构的“根”事件而不是(或附加于)其相邻父级:添加新记录时,只需从直接父级复制根值。然后,在这种情况下,您的问题将简化为过滤那些作为它们自己的根的事件。

标签: javascript php jquery mysql codeigniter


【解决方案1】:

我认为检索比您需要的更多记录然后处理所有“相关”和“重复”的东西会更有效 - 然后只返回您需要的记录数。

例如,检索最近的 30 个事件(任意数量)。然后,对“相关”和“重复”记录施展魔法。假设您剩下 24 条记录 - 只需返回该列表中最近的 6 条。

检索和处理 30 个事件而不是 6 个事件几乎不会影响性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-02
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 2023-03-17
    • 1970-01-01
    • 2015-11-22
    相关资源
    最近更新 更多