2010-08-21 3 views
0

Я хочу в таблице называется week_year со следующей схемой:Вставка 52 недель за каждый год в MySQL (PHP скрипт)

Week_year = {id, week, year}

Чтобы вставить недели за каждый год, таким образом, что за 2001 год есть неделя 1, неделя 2, неделя 3, ..., неделя 52, а затем начинаются за 2002 год до 2009 года.

Я пробовал разные PHP-скрипты, но, похоже, , Я пробовал разные таблицы, один на год и один на неделю, а затем каждую неделю показывал год_ид, но это не показалось эффективным.

Я надеюсь, что кто-то может мне помочь, я считаю, что это простой цикл PHP, чтобы сгенерировать эти числа и вставить их в мою базу данных MySQL.

Добавлена ​​дополнительная информация размещена в ответ

Я попробовал этот код, который представляет собой бесконечный цикл в году:

<?php 

$year = 2001; 
$week_start = 1; 
$week_end = 52; 

for ($week_start = 1; $week_start <= 52; $week_start++) { 

echo $week_start; 
echo "<br />"; 
    for ($week_start = 1; $week_start <= 52; $year++) { 
     echo $year; 
     echo "<br />"; 
    } 
} 
?> 
+0

- все поля целые? это идентификатор столбца auto_increment? –

+0

Можете ли вы опубликовать код, который вы пробовали, и сообщение об ошибке, которое вы получили? –

+0

Да, все поля являются целыми числами, а id - A_I. Я могу опубликовать некоторые из кода yes, hold on pleace – Mestika

ответ

3

ли это в SQL, а не PHP:

create table artificial_range(int id not null auto_increment, ci int); 

insert into artificial_range(c1) values (1); 

- ТЕПЕРЬ ВДВОЕ РАЗМЕР artificial_range

insert into artificial_range(c1) select c1 from artificial_range; 

- повторить вышеописанную вставку еще пять раз; - теперь у вас есть 64 строк в artificial_range

-- now insert into week_year: 
insert into week_year(week, year) 
select a.id, b.id + 2000 
from 
    artificial_range a, 
    artificial_range b 
where a.id < 53 and b.id < 10; 


-- or even better, just make week_year a view: 
create view week_year as 
select a.id as week, b.id + 2000 as year 
from 
    artificial_range a, 
    artificial_range b 
where a.id < 53 and b.id < 10; 

один нюанс: в зависимости от того, что вы имеете в виду под «неделей», несколько лет 53 недель.

+0

+1: вы сохраните весь трафик с веб-сервера, который будет генерировать PHP. что это не так, потому что не нужно управлять кодом приложения. –

2
$id_start = 1; 
for ($year=2002; $year<=2009; $year++) { 
    $values = array(); 
    for ($week=1; $week<=52; $week++) { 
     $values[] = implode(',', array($id_start++, $week, $year)); 
    } 
    $query = 'INSERT INTO `week_year` (id, week, year) ' 
      . 'VALUES (' . implode('),(', $values) . ')'; 

    $db->query($query); 
} 

** ПРИМЕЧАНИЕ ** проверьте функцию PHP localtime(). Вам не нужно иметь таблицу с неделей в год, просто временную метку и использовать эту метку времени с $info = localtime($row->timestamp, true) и сделать $weekNumber = floor($info['tm_yday']/7);, чтобы получить номер своей недели. Просто мысль.

0

просто вызовите populate_year_week (2001,2009) хранимую процедуру из вашего php-скрипта!

drop table if exists year_week; 

create table year_week 
(
year_id smallint unsigned not null, 
week_id tinyint unsigned not null, 
primary key (year_id, week_id) 
); 

delimiter ; 

drop procedure if exists populate_year_week; 

delimiter # 

create procedure populate_year_week 
(
in from_yr smallint unsigned, 
in to_yr smallint unsigned 
) 
proc_main:begin 

declare yr smallint unsigned default 0; 
declare wk tinyint unsigned default 0; 

    truncate table year_week; 

    -- put some validation here ! 
    if to_yr < from_yr then 
     leave proc_main; 
    end if; 

    -- create years and weeks... 
    set yr = from_yr; 
    while yr <= to_yr do 

    set wk = 1; 
    while wk < 53 do 
     insert into year_week (year_id, week_id) values (yr,wk);  
     set wk=wk+1; 
    end while; 

    set yr=yr+1; 
    end while; 

end proc_main # 

delimiter ; 

call populate_year_week(2001,2009); 

select * from year_week order by year_id, week_id; 
Смежные вопросы