我有一个包含许多条目的数据库,其中也包含日期时间字段。 现在,索引是一个md5哈希值,它从包括日期在内的其他字段计算得出,使每个条目都是唯一的。
最好的展示方式是什么让我们说这个数据库每页50个结果?你能提供一个php示例吗?
我可能看不到这个权利,但如果我将整数ID字段用作唯一键(它会自动递增),这会更容易,因为那时我可以查询最后一个ID,如9412并执行-50到获取第一页的最后50个结果,然后在用户点击箭头时执行-50以获得第2页上的前50个结果。
这个问题的唯一问题是我更新了这个数据库,以避免哈希重复输入。如果ID是一个自动递增的整数,那么这可能不起作用。
感谢。
答案 0 :(得分:1)
正如其他人所说,我还建议使用LIMIT, OFFSET
。
我在相当多的网站上看过这种方法:
用户点击例如第5页并重定向到
-> view.php?p=5
在PHP文件中有类似这样的内容:
$page = $_GET['p'];
$limit = 50;
$page = ($page - 1) * $limit;
$sql = "SELECT * FROM Posts LIMIT ".$limit." OFFSET ".$page." ORDER BY ID";
. . .
答案 1 :(得分:0)
您无需担心ID。在SQL中使用LIMIT
和OFFSET
。
SELECT * FROM tbl
ORDER BY f_date DESC
LIMIT 50 OFFSET 0
将是您结果的第一页。您可以增加偏移量以获取其他页面,例如第二页是OFFSET 50
。
要获取有关此主题的更多信息,请使用Google并搜索分页。
答案 2 :(得分:0)
我不确定你的哈希值,但使用GUID(全局唯一ID)比自动增量,整数id值有几个优势。 GUID主键很适合许多开发方案,例如复制,或者当您需要在数据库外部生成主键时。
关于分页,您需要找到定义数据自然顺序的字段或字段组合。例如。你可以使用日期字段。然后,您可以使用此顺序来实现LIMIT和OFFSET关键字的分页。这就是你获得第一页的方式:
select * from table
order by date_field desc -- show most recent records on top
limit 10 offset 0;
这是你获得第二页的方式:
select * from table
order by date_field desc -- show most recent records on top
limit 10 offset 10;
这是你获得第N页的方式:
select * from table
order by date_field desc
limit 10 offset 10*N;
答案 3 :(得分:0)
如果允许删除行,则整数自动递增的ID与您的计算结合不是一个好的解决方案,就分页/排序而言。两者都很难" delete删除表中的行," soft"删除你有isActive列的地方,这会阻止显示行,如果将值设置为非活动状态,将会搞乱你的计算。具有特定ID的行将丢失,这意味着您的结果集有时会少于50行,或者将显示不应该可见的非活动行。您可以使用" LIMIT"在你的MySQL查询中。
LIMIT子句可用于约束SELECT语句返回的行数。 LIMIT需要一个或两个数字参数,它们都必须是非负整数常量(使用预准备语句时除外)。
使用两个参数,第一个参数指定要返回的第一行的偏移量,第二个参数指定要返回的最大行数。初始行的偏移量为0(不是1):
SELECT * FROM tbl LIMIT 5,10; #检索行6-15
http://dev.mysql.com/doc/refman/5.0/en/select.html
将它与分页相结合,你就有了一个很好的解决方案。
至于排序,这取决于您何时更新日期行。如果日期列是不可变的,使用LIMIT结合按日期排序将确保一致的表示,否则表示将随着时间的推移而变化,因为日期列发生了变化,但它仍然有效(您将获得50行,它们将全部是可见的活动行。)
如果您的日期列可更改(例如它反映了上次登录信息),但您希望确保以相同的方式订购记录(相同的50条记录始终显示在第1页等),您可以负担得起要添加列,您可以添加不可变整数自动增量列以进行排序,但保留主键列,因为它对您来说很方便