表之间的php pdo复制列

时间:2014-04-15 11:12:03

标签: php sql pdo

我得到了两个表(表1和表2):

Table1:
id      hits    url    
1       11      a    
2       5       b    
3       6       c        
4       99      d    
5       14      e


Table2:
id      url    2014.04.13    2014.04.14
1       a      0             5
2       b      0             1
3       c      0             3
4       d      0             60
5       e      0             10

大家好,

表1包含实际点击(始终是最新的)和表2到统计数据(每天午夜完成)。列id(唯一编号)和url在两个表中都是相同的。所以他们得到了相同数量的行。

所以我每天都会创建一个新列(具有今天的日期),并将列表'Table1'中的列点击复制到新创建的列中,进入表'Table2'

首先我改变表2:

$st = $pdo->prepare("ALTER TABLE Table2 ADD `$today_date` INT(4) NOT NULL");
$st->execute();

然后我从Table1缓存我需要的所有条目:

$c = 0;
$id = array();
$hits = array();

$sql = "SELECT id, hits FROM Table1 ORDER BY id ASC";

$stmt = $pdo->query($sql);
while($row = $stmt->fetch(PDO::FETCH_ASSOC))
{
    $id[$c] = $row['id'];
    $hits[$c] = $row['hits'];
    $c++;
}

最后我更新了Table2:

for ($d = 0 ; $d < $c ; $d++)
{
    $id_insert = $id[$d];
    $sql = "UPDATE DOWNLOADS_TEST SET `$datum_det_dwnloads`=? WHERE id=?";  
    $q = $pdo->prepare($sql);  
    $q->execute(array($hits[$d], $id[$d]));

    if($q->rowCount() == 1 or $hits[$d] == 0) // success
        $hits[$d] = 0;
    else // error inserting (e.g. index not found)
        $d_error = 1; // error :( //
}

所以我需要的是将一个列从一个表复制(插入)到另一个表。

这两张表有~2000个元素,如上所述的复制大约需要40秒。瓶颈是我发现的最后一部分(插入表2)。

我发现的一件事是在一个查询中进行多个更新。除此之外我能做些什么吗?

1 个答案:

答案 0 :(得分:1)

我希望你意识到,在某些时候你的表会有无理数的列,并且会非常无效。我强烈建议您使用其他解决方案,例如另一个表,其中包含每天每行的数据。

假设您有一个包含2000行和两列的表:ID和URL。现在,您想知道每个URL的点击次数,以便添加列HITS。但是你意识到你需要知道每个日期的每个URL的点击次数,所以你最好的选择是分割表格。此刻你有一张桌子:

Table A (A_ID, URL, HITS)

现在从表A中删除HITS并创建具有ID和HITS属性的表B.现在你有:

Table A (A_ID, URL)
Table B (B_ID, HITS)

下一步是连接这两个表:

Table A (A_ID, URL)
Table B (B_ID, A_ID, HITS)

其中A_ID是表A的属性“A_ID”的外键。最后,它与第一步相同。但是现在可以很容易地将日期属性添加到表B中:

Table A (A_ID, URL)
Table B (B_ID, A_ID, HITS, DATE)

您有数据库结构的解决方案。表B中有很多条目,但它仍然比很多列好。示例如下:

Table A | A_ID |    URL
           0      index
           1      contact

Table B | B_ID | A_ID | HITS | DATE
           0      0      23    12.04.2013
           1      1      12    12.04.2013
           2      0      219   13.04.2013
           3      1      99    13.04.2013

您还可以在表B中创建A_ID和DATE的唯一索引,但我更喜欢在链接表上处理ID。