Как использовать номер недели для выбора уникального идентификатора записи MYSQL PHP - PullRequest
0 голосов
/ 01 декабря 2018

Не уверен, что мой заголовок точно объясняет, что я пытаюсь сделать, но вот мой пример использования:

У меня есть база данных идентификаторов 1 = n, назовем это 500 записей.

Я хочу сначала получить номер недели в PHP $week = date('W'), поэтому на этой неделе 48.

Затем я хочу вернуть 3 уникальных идентификатора, которые всегда будут возвращать один и тот же идентификатор для этой недели.Например,

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 идентификатора, затем умножить неделю на 2 для второй недели, затем каждыйна следующей неделе продолжайте умножать на 2 и добавлять $i = 1 каждую неделю, увеличивая $i++ каждую неделю и выбирая следующие 3 идентификатора из начального номера.Мое решение, приведенное ниже, похоже, работает, но оно выглядит как-то странно.

$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 было бы намного лучше, если бы он мог обрабатывать таблицу с непоследовательными идентификаторами.В моем случае мой идентификатор должен быть последовательным, если у меня будет разрыв в EX идентификатора: 1,2,3,4,6,7,8,10, это может испортить выходной массив.

Спасибо за помощь.

Ответы [ 3 ]

0 голосов
/ 02 декабря 2018

Если вы вытаскиваете все данные из своей таблицы, ORDER BY id и просто наберите array_chunk($array, 3) в вашем массиве результатов и получите доступ к нужному набору-3, вычтя 1 из номера недели.


Если вам нужно только извлечь из таблицы три нужные строки, то вы можете ORDER BY id и установить LIMIT «смещение» на (неделя минус 1) раз 3, а «предел» на 3.

0 голосов
/ 02 декабря 2018

В качестве альтернативы, если вас не пугает немного магии SQL, вы можете написать пользовательскую переменную в своем запросе, чтобы вся информация была легко сгруппирована в вашем наборе результатов.

SQL( SQL Demo )

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 идентификаторов, используйте php, чтобы определить номер текущей недели, разделите егона три округлите это число до следующего целого числа, затем вычтите одно так, чтобы предложение LIMIT в запросе использовало 0 (для недели 1) для целевых идентификаторов 1, 2 и 31 (на неделю 2) для целевых идентификаторов 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 для выполнения этой задачи, заключается в следующем: МожетЯ использую функции MySQL в смещении LIMIT .

0 голосов
/ 01 декабря 2018

Нет необходимости хранить все недели в массиве, простую функцию можно выполнить:

$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
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...