在命名数据库中引用和调用信息的最佳方法是什么

时间:2015-04-16 19:47:29

标签: php mysqli computer-science

我有两个db。一个保存所有创建的时间代码,其中包含时间码的唯一ID#(code_id)。它看起来像这样:

----------------------------------------------
|                  time_codes                |
----------------------------------------------
|code_id | dept_id | code_number | code name |
----------------------------------------------
|   10   |    9    |    13       | Excavation|
|   11   |    9    |     4       | Concrete  |
|   12   |   11    |    73       | Masonry   |
----------------------------------------------

然后我输入了时间表记录db,其中一名员工在当天的每项任务中记录了他的时间。它看起来像这样:

---------------------------------------------------------------
|                            time_log                         |
---------------------------------------------------------------  
| id | date | job_number | department_id | code_id | log_time |
---------------------------------------------------------------
| 59 | y-m-d| xx-xx-xxxx |       9       |    13   |    3.25  |
| 64 | y-m-d| xx-xx-xxxx |      11       |    73   |    6.00  |
---------------------------------------------------------------

我想在回忆录制的code_number,code_name上的条目时引用time_log。我想知道最好的方法是有效地引用它们而不会对服务器造成负担。

我想到了两种方法; 1.在每个time_log记录的while()循环中,我可以创建一个mysqli_query来查找code_id,然后获取名称并将其打印在指定的位置。 看起来像这样:

$hours_qry = mysqli_query($con,"SELECT `date`,`job_number`,`code_id`,`log_time` FROM `time_log` WHERE `date` BETWEEN STR_TO_DATE('$from_date', '%Y-%m-%d') AND STR_TO_DATE('$to_date', '%Y-%m-%d') ORDER BY `date` ASC, `job_number` DESC,`code_id` ASC");
    // get records within work week
    while($result = mysqli_fetch_array($hours_qry)){
       $Cdate = $result['date'];
       $Cjob_number = $result['job_number'];
       $Ccode_id = $result['code_id'];
       $Clog_time = $result['log_time'];

       // get code name and number for display
       $code_qry = mysqli_query($con,"SELECT `code_number`,`code_name` from `time_codes` WHERE `code_id` = $Ccode_id");
       while($code_results = mysqli_fetch_array($code_qry)){
          $code_number = $code_results['code_number'];
          $code_name = $code_results['code_name'];
       }

    }

但是我认为这会在每次循环处理条目时反复创建不必要的查询调用。

那么我想也许我可以(但我不知道怎么做); 2.在time_codes while()循环之前进行此time_log查询调用,并创建time_codes的数组。然后在while()循环中,我可以某种方式引用数组并拉出匹配code_number, code_name的{​​{1}}。

哪个更好,或者这些都不如更常见的方法?

1 个答案:

答案 0 :(得分:1)

如果使用一个查询在DB中进行JOIN而不是分两步提取,则会更快:

$query = mysqli_query($con,"SELECT date, job_number, tl.code_id, log_time, code_number, code_name FROM time_codes tc JOIN time_log tl ON tc.code_id = tl.code_id WHERE date BETWEEN STR_TO_DATE('$from_date', '%Y-%m-%d') AND STR_TO_DATE('$to_date', '%Y-%m-%d') ORDER BY date ASC, job_number DESC,tl.code_id ASC");

while($result = mysqli_fetch_array($query)) {
       $Cdate = $result['date'];
       $Cjob_number = $result['job_number'];
       $Ccode_id = $result['code_id'];
       $Clog_time = $result['log_time'];
       $code_number = $result['code_number'];
       $code_name = $result['code_name'];
}