Reputation: 1256
Below is my code without server-side processing but as it produces many rows and will grow considerably I need to use server-side processing.
DB Tables (not all fields included but these are the ones i want and the fields to 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)
I want to be able to display the UNIXTIMESTAMP as date('d/m/Y');
Would this work for the 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
";
Original php version without server-side processing:
$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>';
}
I have server-side processing woking fine with my datatables but without linking to the other tables. This table only returns IDs and I want to be able to get the value from another table as demonstrated above.
Do I need to use an innner join? If so how can I incorporate with server_processing.php script: I used this one: http://datatables.net/release-datatables/examples/data_sources/server_side.html
Or can I incorporate my above method within server_processing.php.
Any guidance would be greatly appreciated. Thanks in advance.
Upvotes: 3
Views: 11740
Reputation: 1256
Answer to the question: Problem was had 2 column names the same so i used alises in the SQL query. Also did not use INNER JOIN.
Columns array using the alias names and column names:
$aColumns = array( 'catname', 'fullname', 'modulename', 'added');
The SQL query for the 4 tables:
$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());
Upvotes: 3
Reputation: 76910
Yes i think that you should use an inner join (but i need more details about the tables to write the exact query) and then you mustmodify the sql here
$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 - to log the query do
$filename = __DIR__.DIRECTORY_SEPARATOR."logging.txt";
file_put_contents($filename, $sQuery, FILE_APPEND);
you should have a logging.txt file in the same directory of the script
Upvotes: 2