【问题标题】:Datatables server-side processing INNER JOIN or multiple tablesDatatables 服务器端处理 INNER JOIN 或多个表
【发布时间】:2012-03-26 10:03:50
【问题描述】:

以下是我的代码,没有服务器端处理,但由于它产生许多行并且会显着增长,我需要使用服务器端处理。


DB 表(并非所有字段都包括在内,但这些是我想要的,也是 INNER JOIN 的字段):

course_modules -       id (pk), course(course.id), module(module.id), added(UNIXTIMESTAMP)
course -               id (pk), category(course_categories.id), fullname(text)
course_categories-     id (pk), name(text)
modules-               id (pk), name(text)

我希望能够将 UNIXTIMESTAMP 显示为 date('d/m/Y');


这对 INNER JOIN 有用吗

$sQuery = "
    SELECT SQL_CALC_FOUND_ROWS ".str_replace(" , ", " ", implode(", ", $aColumns))."
    FROM   $sTable 
    INNER JOIN modules ON $sTable.module = modules.id 
    INNER JOIN course ON $sTable.course = course.id 
    INNER JOIN course_categories ON course.category = course_categories.id
    $sWhere
    $sOrder
    $sLimit
";

没有服务器端处理的原始php版本:

$mods = get_records_sql("SELECT * FROM {$CFG->prefix}course_modules");

foreach ($mods as $mod)
    {

    $thecourse = get_record('course','id',$mod->course); 
    $themodule = get_record('modules','id',$mod->module); 
    $thecat = get_record('course_categories','id',$thecourse->category); 


    echo '<tr>'; 
    echo '<td>'.$thecat->name.'</td>'; 
    echo '<td>'.$thecourse->fullname.'</td>'; 
    echo '<td>'.$themodule->name.'</td>'; 
    echo '<td>';
    echo date('d/m/Y', $mod->added);
    echo'</td>'; 
    echo '</tr>'; 
    } 

我的数据表的服务器端处理工作正常,但没有链接到其他表。此表仅返回 ID,我希望能够从另一个表中获取值,如上所示。

我需要使用内部联接吗?如果是这样,我如何与 server_processing.php 脚本合并: 我用过这个:http://datatables.net/release-datatables/examples/data_sources/server_side.html

或者我可以将上述方法合并到 server_processing.php 中。

任何指导将不胜感激。 提前致谢。

【问题讨论】:

    标签: jquery jquery-plugins datatables


    【解决方案1】:

    问题的答案: 问题是有 2 个列名相同,所以我在 SQL 查询中使用了别名。 也没有使用 INNER JOIN。

    使用别名和列名的Columns数组:

    $aColumns = array( 'catname', 'fullname', 'modulename', 'added');
    

    4 个表的 SQL 查询:

    $sQuery = "
        SELECT mdl_course.fullname, mdl_modules.name AS modulename, mdl_course_categories.name AS catname, mdl_course_modules.added
        FROM  mdl_course_modules, mdl_modules, mdl_course, mdl_course_categories
        WHERE mdl_course_modules.module = mdl_modules.id AND mdl_course_modules.course = mdl_course.id AND mdl_course.category = mdl_course_categories.id
        $sOrder
        $sLimit
    ";
    $rResult = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
    

    【讨论】:

      【解决方案2】:

      是的,我认为您应该使用内部联接(但我需要有关表的更多详细信息来编写确切的查询),然后您必须在此处修改 sql

        $sQuery = "
          SELECT SQL_CALC_FOUND_ROWS ".str_replace(" , ", " ", implode(", ", $aColumns))."
          FROM   $sTable
          $sWhere
          $sOrder
          $sLimit
      ";
      $rResult = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
      

      EDIT - 记录查询做

      $filename = __DIR__.DIRECTORY_SEPARATOR."logging.txt";
      
      file_put_contents($filename, $sQuery, FILE_APPEND);
      

      您应该在脚本的同一目录中有一个 logging.txt 文件

      【讨论】:

      • @:Nicola Peluchetti:我已经用数据库结构修改了这个问题。谢谢
      • @:Nicola Peluchetti:更新了我的 INNER JOIN,看起来对吗?
      • @Codded 是的,它应该可以工作,但无论如何你应该记录查询(你可以使用 firephp)并验证它在 mysql 中是否正确
      • @:Nicola Peluchetti:我正在获取 - DataTables 警告:无法解析来自服务器的 JSON 数据。这是由 JSON 格式错误引起的。它是否正确? - $aColumns = array('course.fullname', 'modules.name', 'course_categories.name', 'course_modules.added');
      • @Codded 是的,这可能是原因,但也许只是 PHP 出错(可能查询无效)并输出通知,因此无法解析 json跨度>
      猜你喜欢
      • 2017-01-04
      • 2021-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-13
      • 1970-01-01
      • 1970-01-01
      • 2018-11-01
      相关资源
      最近更新 更多