【问题标题】:Autopopulating a Mysql Table from Another Mysql Table with iterations through PHP通过 PHP 迭代从另一个 Mysql 表中自动填充一个 Mysql 表
【发布时间】:2013-01-20 01:13:21
【问题描述】:

对此的解释可能看起来有点冗长和复杂,但请多多包涵。本质上,我想要做的是从我的数据库中的另一个 mysql 表(B)填充一个 mysql 表(A),但为了这样做,我需要复制表(A)中的值,以便有足够的条目来容纳对于表 B 中的值。

现在来看一个更具体的例子

表格的外观

course_details 表

course_details_id | course_id |年号 |教师编号 +--------+-----------+------------+------ ------+ 1 1 待设置 36 2 2 待设置 54 3 3 待设置 78 4 4 待设置 23

年表

year_semester_id |年份 |学期 +-----------------+-----+----------+ 1 2012 1 2 2012 2 3 2012 3 4 2012 4 5 2013 1 6 2013 2 7 2013 3 8 2013 4

我希望桌子看起来如何

 course_details_id | course_id |年号 |教师编号
-------------------+------------+---------+-------- ----+
         1 1 1 36
         2 1 2 36
         3 1 3 36
         4 1 4 36
         5 1 5 36
         6 1 6 58
         7 1 7 36
         8 1 8 47
         9 2 1 54
        10 2 2 54
        11 2 3 54
        12 2 4 67
        13 2 5 67
        14 2 6 54
        15 2 7 54
        16 2 8 54

代码的外观

<?php
require_once('open_db.php');
get_dbhandle();

$query_year = "SELECT * FROM year"; 
$result_year = mysql_query($query_year) or die(mysql_error());
$num_year_rows = mysql_num_rows($result_year);
$num_year_rows = ($num_year_rows - 1);

$query_yearid = "SELECT year_semester_id FROM year"; 
$result_yearid = mysql_query($query_yearid) or die(mysql_error());

$result_ccheck = mysql_query("SELECT course_id FROM courses");
while($row = mysql_fetch_array($result_ccheck))
    {
      $course_id = $row['course_id'];
               
       for($i = $num_year_rows; $i >= 0; $i--)
       {
        $query_cdetails = "INSERT INTO course_details (course_id) VALUES ('$course_id')";
        $result_cdetails = mysql_query($query_cdetails);
                       
           while($row = mysql_fetch_array($result_yearid))
           {
             $year_semester_id = $row['year_semester_id'];
             $query = "INSERT INTO course_details(year_semester_id) SELECT year_semester_id FROM year";
             $result = mysql_query($query);
            }
                                               
        }      
    }
?>

它的作用与我想要它做的事情:按照目前的设置,它正确地在 course_details 表中创建每个 course_id 的重复项,以匹配年表中存在的 year_semester_id 的数量,这是完美的。问题在于在 course_details 表的每个对应表槽中插入 year_semester_id。

也就是说,保证当 course_id =1 , year_semester_id=1, course_id=1, year_semester_id =2,....course_id=1, year_semester_id=8, course_id=2, year_semester_id=1, course_id=2 , year_semester_id=2......course_id=2, year termemester_id =8, course_id=3, year_semester_id =1 etc.... 问题就出在这里。

回顾一下代码的工作原理,它计算 years 表中 year_semester_id 的数量,然后将该数字减去 1,即 course_id 当前在 course_details 表中的次数,并将其复制为该数字.这个总数(重复)加上原始 course_id 应该是 year_semester_ids 的总量。我现在想为存在的每个 course_id 插入每个 year_semester_id 并循环直到每个 course_id 都被计算在内。谢谢

【问题讨论】:

  • 请尝试使用code formattingread
  • 表 1 中的数据不适合表结构。
  • 表1中的数据只是用于代码本身的重要信息。现在的teacher_id是补充的,不重要也不会填写。但是该模板可供将来添加。 year_id 当前未设置,因为它是从 year_semester_id 表中填写的,因此在 course_details 表中的值当前为空。
  • Please, don't use mysql_* functions in new code。它们不再维护and are officially deprecated。看到red box?改为了解prepared statements,并使用PDOMySQLi - this article 将帮助您决定哪个。
  • 如果你做一个关系表,这样做会更容易,做一个有2个外键的表,1个指向course_details_id,另一个指向year_semester_id,这样你就可以查询到每年为每门课程插入该表。当你想得到最终的表时,可以使用 INNER JOIN 来连接表之间的关系,并选择两个表。

标签: php mysql database database-design


【解决方案1】:

This is what im talking about查看代码,如果您有理解困难,请告诉我。

【讨论】:

  • 非常感谢。我目前已经制作了一个包含不同信息的课程表,但是添加您所做的更改甚至会使关系数据库更加模块化。非常感谢。
  • 绝对是问题的答案。当我有足够的代表时,我会保证向你们俩投赞成票。
【解决方案2】:

在我看来,您尝试做的事情可以通过利用关系表轻松完成,而不会导致数据库膨胀。在这种情况下,如果我对您的理解正确,这里的最终结果是您希望拥有来自 course_details 的所有行的重复项,并将空列设置为 year 表中的每一行。

这是真的,您可以使用 JOIN 语句选择该数据:

SELECT `a`.`course_id` , `b`.`year_semester_id` as `year_id` , `a`.`teacher_id` FROM `course_details` `a` INNER JOIN `year` `b`

这应该会在 MySQL 结果集中返回您想要的数据。如果您想将该数据插入表中,只需确保该表具有正确的列,并将 course_Details_id 字段设置为自动递增并执行以下操作:

INSERT INTO `tablename` ( `course_id` , `year_semester_id` , `year_id` ) VALUES (
    SELECT `a`.`course_details_id` , `a`.`course_id` , `b`.`year_semester_id` as `year_id` , `a`.`teacher_id` FROM `course_details` `a` INNER JOIN `year` `b`
)

这应该将您需要的所有数据插入到新的 MySQL 表中,而不需要 PHP 脚本。

【讨论】:

  • 实际上查看了这个答案 Brian,我对其进行了测试,发现它还重复了 course_details_id,这使得内连接毫无意义,因为多行将具有相同的 course_details_d 和 course_id,因此很难区分它们。
  • 你是对的。我已更新查询以排除该字段。在 select 语句中,如果您只是以这种方式从数据库中读取数据,则实际上并不需要它。或者,如果需要,您可以自己从表中选择关键字段。插入内容也已更新,应与 auto_increment 字段一起用作表的键。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
  • 2023-03-03
  • 2023-03-21
  • 2012-12-05
  • 2022-09-23
  • 1970-01-01
相关资源
最近更新 更多