JBTALKS.CC

标题: page system [打印本页]

作者: ~Zero    时间: 2010-9-13 03:27 PM
标题: page system
我在 develop 着一个 system, 是 display ads 的, 一个 ad 有分大和小两种.
1 个大的 = 4 个小的

然后现在要做 paging 咯, 就是说一面只要 display 8 个大的, 或相等数量的小的 (如果大的完了).
大的肯定会先 display 完, 才到小的.

例子:
如果我有 20 大 20 小,
page 1: 8 大
page 2: 8 大
page 3: 4 大 + 16 小
page 4: 4 小

这些都是从 sql 那边拿来的资料.
我知道是如果没有分大小的话, paging 可以用 SQL 里面的 LIMIT 来做,
可是现在的话, 就不知道有什么好方法了.

这些 result 不是 fixed 的, 是 search + filter 后的 result, 所以不能说把他们所属于的 page 存进 database 里面.
作者: Super-Tomato    时间: 2010-9-13 03:37 PM
我在 develop 着一个 system, 是 display ads 的, 一个 ad 有分大和小两种.
1 个大的 = 4 个小的

然后现 ...
~Zero 发表于 2010-9-13 03:27 PM


大小資料先設定个 priority,之後 sql使用 order by 与 limit 即可达到你的要求
作者: ~Zero    时间: 2010-9-13 03:44 PM
有 priority 了, 可是问题在于怎样 LIMIT?
作者: Super-Tomato    时间: 2010-9-13 03:47 PM
有 priority 了, 可是问题在于怎样 LIMIT?
~Zero 发表于 2010-9-13 03:44 PM



    SELECT * FROM [table] ORDER BY [priority] DESC LIMIT [start], [limit]
作者: ~Zero    时间: 2010-9-13 03:49 PM
我知道 syntax,

可是就说说吧, 我怎么知道 page 1 要 limit 0, 8?
我怎么知道 page 3 要 limit 16, 20?
作者: ~Zero    时间: 2010-9-13 04:37 PM
我想到一个办法, 就是每次 search + filter 后, 把 result 和相对应的 page store 进 session 里面, 然后如果他们换 page 的时候就从 session 里面 retrieve 出该 page 的 result, 再从 sql 拿出来.

不知道适合不适合. 不过这是目前为止想到的唯一方法...
作者: Super-Tomato    时间: 2010-9-13 05:26 PM
我知道 syntax,

可是就说说吧, 我怎么知道 page 1 要 limit 0, 8?
我怎么知道 page 3 要 limit 16, 20?
~Zero 发表于 2010-9-13 03:49 PM


已知条件
1. A = 1, B = A * 4
2. A 与 B 各 20
3. 限制 A 的數量 = 8

接下來對 programmer 來說就是運算的部分,之後即可得出 [start] 和 [limit] 了
作者: 宅男-兜着走    时间: 2010-9-13 10:00 PM
我的方法:

let x = 18 as  total item.
let y = 8 as total item display per page.
let p = floor(x / y) as total page.
let o = (current page - 1) *  y

有更好的方式就分享吧。
作者: Super-Tomato    时间: 2010-9-13 11:17 PM
我的方法:

let x = 18 as  total item.
let y = 8 as total item display per page.
let p = floor(x ...
宅男-兜着走 发表于 2010-9-13 10:00 PM



這是正常的分頁方式,因為樓主的有數量上的不同,所以驗算方式就有些差别
作者: 宅男-兜着走    时间: 2010-9-13 11:25 PM
回复 9# Super-Tomato

哦哦~抱歉我没看清楚他的问题。 也看不懂。
就以为他要的只是普通的。
作者: Super-Tomato    时间: 2010-9-13 11:35 PM
回复  Super-Tomato

哦哦~抱歉我没看清楚他的问题。 也看不懂。
就以为他要的只是普通的。
宅男-兜着走 发表于 2010-9-13 11:25 PM



呃,也就是类似已知一個箱子刚好可以装 8 粒篮球,如果篮球用完就用另一不同体积的球类繼續装到箱子满。
目前有A(篮球) 20 粒,B球 20 粒,而 A 球的体积等于 B 球的 4 倍,所以目前樓主所要求的是如何知道某箱内有多少 A 球和 B 球
作者: ~Zero    时间: 2010-9-13 11:44 PM
已知条件
1. A = 1, B = A * 4
2. A 与 B 各 20
3. 限制 A 的數量 = 8

接下來對 programmer 來 ...
Super-Tomato 发表于 2010-9-13 05:26 PM

这就是最大的问题所在, 我想不到很好的运算方法. = =+
作者: Super-Tomato    时间: 2010-9-13 11:49 PM
这就是最大的问题所在, 我想不到很好的运算方法. = =+
~Zero 发表于 2010-9-13 11:44 PM



如果你的數量不會很多的話,你就用最简单的 looping 方式慢慢递减计算吧,這样编写过程會加强你對计算的变化
作者: ~Zero    时间: 2010-9-14 12:01 AM
本来是 php, 可是我把 syntax 都简单化让大家比较容易了解 algorithm. 题目就是 tomato 的篮子跟球的例子.

  1. page = 3; big = 20; small = 20;

  2. current = 1; start = 0; limit = 0;
  3. while (current < page) {
  4.       basket = 0;
  5.       while ( basket < 32 ) {
  6.             if (big > 0) { big--; basket+=4; start++ }
  7.             else { small--; basket++; start ++ }
  8.       }
  9.       current++
  10. }
  11. // 到这里应该得出 start = 16 了

  12. basket = 0; limit = start;
  13. while (basket < 32 && (big > 0 || small > 0)) {
  14.       if (big > 0) { big--; basket+=4; limit++ }
  15.       else { small--; basket++; limit++}
  16. }
  17. // 到这里就算得出 limit 了.
复制代码
这个方法的话, 就每次换 page 的时候就要 sql 找 count 一次. 虽然是有点浪费 processing power, 但是总比 session 容易多了.
谢谢 tomato, 给了很大提示. 呵呵~
作者: ~Zero    时间: 2010-9-14 12:03 AM
如果你的數量不會很多的話,你就用最简单的 looping 方式慢慢递减计算吧,這样编写过程會加强你對计算 ...
Super-Tomato 发表于 2010-9-13 11:49 PM

那如果数量很多呢?
作者: Super-Tomato    时间: 2010-9-14 12:14 AM
那如果数量很多呢?
~Zero 发表于 2010-9-14 12:03 AM



當然就是抓重點计算,我想這個應該是不难的计算才對啊
作者: ~Zero    时间: 2010-9-14 12:28 AM

  1. page = 3; big = 20; small = 20;

  2. basket = page * 32;
  3. if ( big*4 >= basket ) { start = page*8 }
  4. else { start = big + (basket - big*4) }
复制代码
其实 limit 没那么重要, 我可以直接 sql limit 32 就好了, 要 display 多少我可以在 php 里面弄.
作者: Super-Tomato    时间: 2010-9-14 12:51 AM
其实 limit 没那么重要, 我可以直接 sql limit 32 就好了, 要 display 多少我可以在 php 里面弄.
~Zero 发表于 2010-9-14 12:28 AM



看不明白你這段要求甚么,但你應該把计算重點放在唯一的混合部份

$mixPage = ceil($a / $limit); //馬上即可知道在哪個 page 會進行混合

混合 :
A = $a % $limit;
B = ($limit - A) * 4;


當 $a = 20, $limit = 8 的情况下代入得
$mixPage = 3;

A = 4;
B = 16;


這样已經够浅白了,之後的部份就自己完成吧
作者: ~Zero    时间: 2010-9-14 09:42 AM
其实就是说,
big 占据 4 个位置, small 占据 1 个位置,
如果要找第 3 面的话, 那么前面 2 面就占据了 2 x 32 的位置.

if ( big x 4 >= basket ) 那么, start 就是在 2 x 8 = 16 了.
else 就是说 big 的不够, 已经开始 small 了, 那么 start 就是在 big 的数量加上 basket 填满 big 后的空缺.

你给的找 mix page 的方法也不错, 谢谢参考.




欢迎光临 JBTALKS.CC (https://jbtalks.my/) Powered by Discuz! X2.5