php - 使用 PHP 缩短重复的 1400 行 MySQL UNION 查询

标签 php sql mysql union

我有一个 1275 个字段宽的 MYSQL 表。表中的每一行代表一个类(class)的学生,每个学生有 17 个字段,每个类(class) X 最多 75 个学生,所以 17 X 75 = 1275 个字段。

我设计了一个 SQL UNION 查询,它成功地将学生拉到另一个表中,每个学生都在一行中。

现在,我想将此 UNION 查询用作 PHP 程序的一部分。我已经将查询“导入”到 PHP 中。但是,难道没有办法使用 PHP 来缩短 SQL 查询吗?无耻地,这是我的代码:

    $sql = "
    INSERT INTO $t_mem2
    SELECT localcourse
         , statecourse
         , coursetitle
         , semester
         , section
         , teachercode
         , teachername
         , meetingcode
         , classpop
         , student_id_01 AS student_id
         ,        sex_01 AS sex
         ,        dob_01 AS dob
         ,      grade_01 AS grade
         ,     ethnic_01 AS ethnic
         ,  last_name_01 AS last_name
         , first_name_01 AS first_name
         , $c_sch        AS sch_code
    FROM $t_mem1
    UNION
    SELECT localcourse
         , statecourse
         , coursetitle
         , semester
         , section
         , teachercode
         , teachername
         , meetingcode
         , classpop
         , student_id_02 AS student_id
         ,        sex_02 AS sex
         ,        dob_02 AS dob
         ,      grade_02 AS grade
         ,     ethnic_02 AS ethnic
         ,  last_name_02 AS last_name
         , first_name_02 AS first_name
         , $c_sch        AS sch_code
    FROM $t_mem1
    UNION 
    SELECT localcourse
         , statecourse
         , coursetitle
<...snip..............................>
     , teachername
     , meetingcode
     , classpop
     , student_id_75 AS student_id
     ,        sex_75 AS sex
     ,        dob_75 AS dob
     ,      grade_75 AS grade
     ,     ethnic_75 AS ethnic
     ,  last_name_75 AS last_name
     , first_name_75 AS first_name
     , $c_sch        AS sch_code
  FROM $t_mem1
 ORDER
    BY localcourse
     , statecourse
     , semester
     , section
     , teachername
     , meetingcode
     , last_name
     , first_name" ;

最佳答案

首先,此查询表明您的数据库架构非常非常差。

除此之外,是的,您可以使用 PHP 缩短查询:

$query = "INSERT INTO $t_mem2 ";
for ($i = 1; $i <= 75; $i++) {
    if ($i > 1) {
        $query .= ' UNION ';
    }
    $s = "$i";
    if ($i < 10) {
       $s = '0'.$s;
    }
    $query .= "SELECT localcourse
         , statecourse
         , coursetitle
         , semester
         , section
         , teachercode
         , teachername
         , meetingcode
         , classpop
         , student_id_{$s} AS student_id
         ,        sex_{$s} AS sex
         ,        dob_{$s} AS dob
         ,      grade_{$s} AS grade
         ,     ethnic_{$s} AS ethnic
         ,  last_name_{$s} AS last_name
         , first_name_{$s} AS first_name
         , $c_sch        AS sch_code FROM $t_mem1";
}
$query .= " ORDER
BY localcourse
 , statecourse
 , semester
 , section
 , teachername
 , meetingcode
 , last_name
 , first_name" ;

这将通过在 PHP 代码中生成它来“缩短查询”。另一方面,如果您希望缩短查询访问数据库的时间,那也是可能的;只需修改上面的循环以在每次迭代中重新启动 $query,并将所有结果放在一个数组中。您最终会进行 75 次查询,PHP 将执行 UNION。

关于php - 使用 PHP 缩短重复的 1400 行 MySQL UNION 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3411111/

相关文章:

php - 日期范围查询忽略跨越年末和年初的月份

php - Joomla 使用 JDatabase 插入数据,其中表名存储在 php 变量中

mysql - 如何比较不同字段的日期字段?

javascript - 如何在我的 html 上使用 getJSON

javascript - 使用表单将变量从 JavaScript 发布到 PHP

php - mysql数据无法更新

mysql - 用两个不同的列加入同一个表 laravel

php - 通过 Ajax 发送到 PHP 的 Fabric.js canvas.toDataURL()

sql - 位列上的 bool 运算

mysql - SQL - 两个(连接)表的合并竞争列表