Datatables обрабатывает на сервере INNER JOIN или несколько таблиц - PullRequest
2 голосов
/ 26 марта 2012

Ниже приведен мой код без обработки на стороне сервера, но поскольку он генерирует много строк и будет значительно расти, мне нужно использовать обработку на стороне сервера.


Таблицы БД (не все поля включены, но это те поля, которые мне нужны, и поля для 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 в качестве даты ('d / m / Y');


Будет ли это работать для внутреннего соединения

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

У меня хорошо работает обработка на стороне сервера с моими таблицами данных, но без ссылок на другие таблицы. Эта таблица возвращает только идентификаторы, и я хочу иметь возможность получить значение из другой таблицы, как показано выше.

Нужно ли использовать внутреннее соединение? Если так, как я могу соединиться со сценарием server_processing.php: Я использовал это: http://datatables.net/release-datatables/examples/data_sources/server_side.html

Или я могу включить вышеописанный метод в server_processing.php.

Любое руководство будет с благодарностью. Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 27 марта 2012

Ответ на вопрос: Проблема была с двумя именами столбцов, поэтому я использовал alises в запросе SQL. Также не использовал INNER JOIN.

Массив столбцов с использованием псевдонимов и имен столбцов:

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

SQL-запрос для 4 таблиц:

$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 голосов
/ 26 марта 2012

Да, я думаю, что вы должны использовать внутреннее соединение (но мне нужно больше подробностей о таблицах, чтобы написать точный запрос), а затем вы должны изменить 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());

РЕДАКТИРОВАТЬ - для регистрации запросаdo

$filename = __DIR__.DIRECTORY_SEPARATOR."logging.txt";

file_put_contents($filename, $sQuery, FILE_APPEND);

у вас должен быть файл logging.txt в том же каталоге скрипта

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...