Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Activerecord MySQL获取行,但对于任何匹配的行,获取最新版本_Activerecord_Codeigniter_Mysql - Fatal编程技术网

Activerecord MySQL获取行,但对于任何匹配的行,获取最新版本

Activerecord MySQL获取行,但对于任何匹配的行,获取最新版本,activerecord,codeigniter,mysql,Activerecord,Codeigniter,Mysql,我正在开发一个CMS,并通过使用当前时间戳向数据库添加一个新条目来实现版本控制 我的表格设置如下: id | page | section | timestamp | content “页面”是正在访问的页面,它可以是页面的路径($Page_name),也可以是“/”(表示“全局”字段) “节”是正在编辑的页面的节 我希望能够选择给定页面的所有行,但每个部分只能选择一次,即选择具有最新时间戳的部分 我已尝试使用以下CodeIgniter活动记录代码: $this->db->sele

我正在开发一个CMS,并通过使用当前时间戳向数据库添加一个新条目来实现版本控制

我的表格设置如下:

id | page | section | timestamp | content
“页面”是正在访问的页面,它可以是页面的路径($Page_name),也可以是“/”(表示“全局”字段)

“节”是正在编辑的页面的节

我希望能够选择给定页面的所有行,但每个部分只能选择一次,即选择具有最新时间戳的部分

我已尝试使用以下CodeIgniter活动记录代码:

$this->db->select('DISTINCT(section), content');
$this->db->where_in('page', array('/', $page_name));
$this->db->order_by('timestamp', 'desc');
$query = $this->db->get('cms_content');
它正在生成以下SQL:

SELECT DISTINCT(section), `content`
FROM (`cms_content`)
WHERE `page` IN ('/', 'index.html') 
AND `enabled` = 1
ORDER BY `timestamp` desc
返回两个测试行(除了id、timestamp和content之外,行具有所有相同的字段)

你知道我哪里出错了吗


谢谢

对于所选的所有列都是不同的,因为“内容”不同,您将得到两个不同的行

您只想按时间戳和限制1订购,因为您总是想要最新的

但是我可以建议您保留对“活动”页面的交叉引用吗?这样,您就可以恢复到以前的版本,而无需转储新版本

意思是:

page
----
id
info
active_page_id


page_revisions
--------------
id
page_id
content
timestamp
...

也就是说,您有一对多的页与页之间的修订,以及一对一的页与页之间的修订,以跟踪“当前”修订。使用这种方法,您可以直接加入到活动修订中。

您的错误是认为DISTINCT仅适用于部分-这是一个很容易犯的错误,因为此处的括号具有误导性。事实上,无论是否有括号,DISTINCT都适用于整行。因此,最好省略括号以避免混淆

您的问题是典型的“每组最大值”问题。有很多很多方法可以编写这个查询,它可能是这个站点上最流行的SQL问题之一,所以您可以找到解决它的方法。开始的一种方法是仅选择包含该节最大时间戳的行:

SELECT section, content
FROM cms_content T1
WHERE page IN ('/', 'index.html') 
AND enabled = 1
AND timestamp = (
    SELECT MAX(timestamp)
    FROM cms_content T2
    WHERE page IN ('/', 'index.html') 
    AND enabled = 1
    AND T1.section = T2.section
)

很抱歉,我不知道如何将此SQL代码转换为CodeIgniter活动记录。如果另一个更熟悉Active Record的用户希望将其作为自己答案的起点,欢迎他们使用。

这将在Codeigniter中完成工作,无需临时表格:

$this->db->query( "SELECT *
    FROM cms_content AS c1
    LEFT JOIN cms_content AS c2 
        ON c1.page=c2.page 
        AND c1.section=c2.section 
        AND c1.timestamp < c2.timestamp
    WHERE c2.timestamp IS NULL AND page=?", $page );
$this->db->query(“选择*
从cms_内容中选择c1
左连接cms_内容为c2
在c1页=c2页
和c1.截面=c2.截面
c1.时间戳
啊,我明白了。这很有道理,谢谢!应该能够相当容易地将其转换为活动记录。使用多个表是一个好主意,目前可能会让它尝试一下原型制作。谢谢