php-pdo在表之间复制列


php pdo copy column between tables

我得到了两个表(表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();

然后我缓存表1:中我需要的所有条目

$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++;
}

最后我更新了表2:

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中)。

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

我希望您意识到,在某个时刻,您的表将具有不合理的列数,并且将非常无效。我强烈建议您使用其他解决方案,例如,另一个表每天保存每行的数据。

假设您有一个包含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,甚至是链接表。