如何使用周数选择唯一记录id的mysql php

dkqlctbz  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(377)

不确定我的标题是否准确地解释了我要做的事情,但下面是我的用例:
我有一个身份证数据库 1 = n ,我们称之为500条记录。
我想先用php获取周数 $week = date('W') 所以这周是 48 .
然后我想返回3个唯一的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++ 每周从起始号码中选择接下来的3个id。我下面的解决方案似乎有效,但感觉有点古怪。

$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的表,那就更好了。在我的情况下,我的身份证必须是连续的,如果我的身份证的前男友有人闯入: 1,2,3,4,6,7,8,10 它会弄乱输出数组。
谢谢你的帮助。

zpgglvta

zpgglvta1#

如果要从表中提取所有数据,请按id排序并调用 array_chunk($array, 3) 在resultset数组上,通过从周数中减去1来访问所需的3集。
如果只需要从表中提取所需的三行,那么可以按id排序,并将限制“offset”设置为(周减1)乘以3,然后将“limit”设置为3。

ef1yzkbh

ef1yzkbh2#

不需要在数组中存储所有周,一个简单的函数可以完成这项工作:

$ids = array(1,2,3,4,6,7,8,10);
function weekIds($pWeek){
    $wids = array();
    for($i=1;$i<=3;$i++)
        $wids[] = ($pWeek-1)*3+$i;
    return $wids;
}
$seq = weekIds(2);
foreach($seq as $s)
    $nonSeq[] = $ids[$s-1];
echo 'Sequential: ' .print_r($seq,true).PHP_EOL; 
echo 'Non-Sequential: ' .print_r($nonSeq,true);

输出:

Sequential: Array
(
    [0] => 4
    [1] => 5
    [2] => 6
)

Non-Sequential: Array
(
    [0] => 4
    [1] => 6
    [2] => 7
)
von4xj4u

von4xj4u3#

或者,如果您没有被一点sql魔法吓跑,您可以在查询中编写一个用户定义的变量,这样所有的信息都可以在您的resultset中分组。
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,将该数字四舍五入到下一个整数,然后减去1,以便查询中的limit子句使用 0 (一周内) 1 )目标ID 1 , 2 ,和 3 ; 以及 1 (一周内) 2 )目标ID 4 , 6 , 7 ; 等。
代码:(sql演示)

$limit_offset = ceil(date('W') / 3) - 1;
$query = "SELECT id FROM your_table ORDER BY id LIMIT $limit_offset, 3";

p、 我之所以不使用纯sql来执行这个任务,是因为:我可以在limit offset中使用mysql函数吗。

相关问题