不确定我的标题是否准确地解释了我想要做的事情,但这是我的用例:
我有一个 Id 的数据库1 = n
,我们称之为 500 条记录。
我想首先在 PHP 中获取周数,$week = date('W')
所以本周是48
.
然后我想返回 3 个独特的 ID,这些 ID 将始终返回该周的相同 ID。所以例如。
Week 1 = Id's 1,2,3
Week 2 = Id's 4,5,6
Week 3 = Id's 7,8,9
Week 4 = Id's 10,11,12
Week 5 = Id's 13,14,15
Week 6 = Id's 16,17,18
等等。
我的方法是从第 1 周开始,指定 3 个 Id,然后将第 2 周的周乘以 2,然后每个后续周继续乘以 2 并$i = 1
每周添加并每周递增,然后$i++
从起始号码。我下面的解决方案似乎有效,但感觉有点假。
$weeks = array(1,2,3,4,5,6,7);
$output_arr = array();
$ids_arr = array();
$id1 = 1;
$id2 = $id1 + 1;
$id3 = $id1 + 2;
$i = -1;
foreach ($weeks as $week) {
if ($week == 1) {
$ids = array($id1, $id2, $id3);
$ids = implode(', ', $ids);
} else {
$id1 = $week * 2 + $i;
$id2 = $id1 + 1;
$id3 = $id1 + 2;
$ids = array($id1, $id2, $id3);
$ids = implode(', ', $ids);
}
$output_arr[$week] = $ids;
$i++;
}
所以我的最终结果是:
$output_arr = Array ( [1] => 1, 2, 3 [2] => 4, 5, 6 [3] => 7, 8, 9 [4] => 10, 11, 12 [5] => 13, 14, 15 [6] => 16, 17, 18 [7] => 19, 20, 21 )
这是我想要的,但有更简单的清洁方法吗?而且,BONUS HELP NEEDED
如果它可以处理具有非顺序 Id 的表会好得多。在我的情况下,我的 ID 需要是连续的,如果我在 Id 的 EX 中有中断:1,2,3,4,6,7,8,10
它会弄乱输出数组。
谢谢您的帮助。
或者,如果您没有被一些 SQL 魔法吓到,您可以在查询中编写一个用户定义的变量,以便所有信息都可以在结果集中随时可用。
SQL ( SQL 演示)
SELECT
CEIL(r / 3) AS WeekId, GROUP_CONCAT(id) AS Ids
FROM (
SELECT
@rowid := @rowid + 1 AS r, id
FROM tableA
CROSS JOIN (
SELECT @rowid := 0
) cjoin
) sub
GROUP BY WeekId
输出:
| WeekId | Ids |
| ------ | ----- |
| 1 | 1,2,3 |
| 2 | 4,6,7 |
| 3 | 8,10 |
现在,如果您实际上并不打算使用数据库表的每一行,那么最佳实践表明您应该只检索您打算使用的数据。
要访问一组 3 个 ID,请使用 php 确定当前周数,将其除以 3,将该数四舍五入为下一个整数,然后减去一个,以便查询中的 LIMIT 子句使用0
(对于 week 1
)作为目标id 1
, 2
, 和3
; 和1
(对于周2
)目标 ids 4
, 6
, 7
; 等等。
代码:(SQL 演示)
$limit_offset = ceil(date('W') / 3) - 1;
$query = "SELECT id FROM your_table ORDER BY id LIMIT $limit_offset, 3";
ps 我没有使用纯 SQL 来执行这个任务的原因是:我可以在 LIMIT offset 中使用 MySQL 函数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句