Activerecord MySQL获取行,但对于任何匹配的行,获取最新版本
我正在开发一个CMS,并通过使用当前时间戳向数据库添加一个新条目来实现版本控制 我的表格设置如下:Activerecord MySQL获取行,但对于任何匹配的行,获取最新版本,activerecord,codeigniter,mysql,Activerecord,Codeigniter,Mysql,我正在开发一个CMS,并通过使用当前时间戳向数据库添加一个新条目来实现版本控制 我的表格设置如下: id | page | section | timestamp | content “页面”是正在访问的页面,它可以是页面的路径($Page_name),也可以是“/”(表示“全局”字段) “节”是正在编辑的页面的节 我希望能够选择给定页面的所有行,但每个部分只能选择一次,即选择具有最新时间戳的部分 我已尝试使用以下CodeIgniter活动记录代码: $this->db->sele
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.时间戳
啊,我明白了。这很有道理,谢谢!应该能够相当容易地将其转换为活动记录。使用多个表是一个好主意,目前可能会让它尝试一下原型制作。谢谢