2012-03-26 8 views
2

Unten ist mein Code ohne serverseitige Verarbeitung, aber da es viele Zeilen erzeugt und erheblich wachsen wird, muss ich serverseitige Verarbeitung verwenden.Datatables serverseitige Verarbeitung INNER JOIN oder mehrere Tabellen


DB-Tabellen (nicht alle Felder enthalten, aber diese sind diejenigen, ich will und die Felder zu 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) 

Ich möchte die UNIXTIMESTAMP als Datum in der Lage sein anzuzeigen ('d /meine');


Würde diese Arbeit für die innere

$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 
"; 

Original-PHP-JOIN-Version ohne serverseitige Verarbeitung:

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

Ich habe meine serverseitige Verarbeitung woking gut mit Databases aber ohne Verbindung zu den anderen Tabellen. Diese Tabelle gibt nur IDs zurück und ich möchte den Wert aus einer anderen Tabelle abrufen können, wie oben gezeigt.

Muss ich eine innner Join verwenden? Wenn ja, wie kann ich mit server_processing.php Skript integrieren: Ich habe dieses verwendet: http://datatables.net/release-datatables/examples/data_sources/server_side.html

Oder kann ich meine obige Methode in server_processing.php integrieren.

Jede Anleitung würde sehr geschätzt werden. Vielen Dank im Voraus.

Antwort

3

Antwort auf die Frage haben sollten Mn benennt das gleiche, also habe ich Alices in der SQL-Abfrage verwendet. Auch nicht INNER JOIN verwendet.

Spalten Array mit den Aliasnamen und Spaltennamen:

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

Die SQL-Abfrage für die 4 Tabellen:

$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

Ja, ich denke, dass Sie eine innere Verknüpfung verwenden sollten (aber ich brauche mehr Details über die Tabellen, die genaue Abfrage zu schreiben) und dann mustmodify Sie die SQL hier

$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 - die Abfrage zu protokollieren tun Problem wurde, hat 2 colu:

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

file_put_contents($filename, $sQuery, FILE_APPEND); 

Sie eine logging.txt Datei im gleichen Verzeichnis des Skripts

+0

@: Nicola Peluchetti: Ich habe die Frage mit der DB-Struktur geändert haben. Danke – Codded

+0

@: Nicola Peluchetti: Updates mit meinem INNEREN JOIN, sieht das richtig aus? – Codded

+0

@Codded ja sollte es funktionieren, aber in jedem Fall sollten Sie die Abfrage protokollieren (Sie können firePHP verwenden) und überprüfen, dass es in mysql –