se può esserti utile, questo mi funziona alla perfezione.
javascript:
codice:
    $('#my_table').dataTable({
        // NOMI DEI CAMPI DELLE TABELLE SQL
        "columns": [
            {"data": "cliente_codice"},
            {"data": "cliente_ragsoc"},
            {"data": "cliente_mnemonico"},
            {"data": "cliente_piva"},
            {"data": "cliente_email"},
            {"data": "cliente_attivato"}
        ],
        "processing": true,
        "serverSide": true,
        "ajax": 'clienti_admin.php'
    });
questo il php:
Codice PHP:
$connessione Connessione::getInstance();
    
$clienti = new Clienti($connessione);
    
// PRENDO IL NUMERO TOTALE DI RECORD PER PAGINAZIONE
    
$recordsTotal count($clienti->getByTipo('CL'));

    
// VARIABILI GET DA DATATABLES
    
$columns $_GET['columns'];
    
$search $_GET['search']['value'];
    
$start $_GET['start'];
    
$length $_GET['length'];
    
$draw $_GET["draw"];
    
$orderByColumnIndex $_GET['order'][0]['column'];
    
$orderBy $_GET['columns'][$orderByColumnIndex]['data'];
    
$orderType $_GET['order'][0]['dir'];

    
// CONTROLLO SE LA CASELLA DI RICERCA È VUOTA
    
if (!empty($search)) {
        for (
$i 0$i count($columns); $i++) {
            
$column $_GET['columns'][$i]['data'];
            
$where[] = "$column like '%" $search "%'";
        }
        
// CONCATENO LA WHERE
        
$where "WHERE cliente_clde = 'CL' AND (" implode(" OR "$where) . ")";

        
// QUERY SENZA LIMIT PER CONTARE IL NUMERO DI RECORD TROVATI
        
$cmdNoLimit 'SELECT cliente_codice, cliente_ragsoc, cliente_mnemonico, cliente_piva, cliente_email, cliente_attivato ';
        
$cmdNoLimit .= 'FROM clienti ' $where;
        
$recordsFiltered count($clienti->getGeneric($cmdNoLimit));

        
// QUERY CON WHERE E LIMIT
        
$cmd 'SELECT cliente_codice, cliente_ragsoc, cliente_mnemonico, cliente_piva, cliente_email, cliente_attivato ';
        
$cmd .= 'FROM clienti ' $where ' ORDER BY cliente_codice ' $orderType ' LIMIT ' $start ',' $length;
    } else {
        
// QUERY SENZA FILTRI
        
$cmd 'SELECT cliente_codice, cliente_ragsoc, cliente_mnemonico, cliente_piva, cliente_email, cliente_attivato ';
        
$cmd .= 'FROM clienti WHERE cliente_clde = "CL" ORDER BY ' $orderBy ' ' $orderType ' LIMIT ' $start ',' $length;
        
$recordsFiltered $recordsTotal;
    }

    
// ESEGUO LA QUERY INVIATA COME STRINGA
    
$rows $clienti->getGeneric($cmd);
    
$data = array();
    foreach (
$rows as $var) {
        
$data[] = $var;
    }
    
$res = array(
        
"draw" => $draw,
        
"recordsTotal" => $recordsTotal,
        
"recordsFiltered" => $recordsFiltered,
        
"data" => $data
    
);
    echo 
json_encode($res); 
l'ho commentato per le info generiche.
dovresti solo sostituire:
- nel js i nomi dei campi delle tabelle
- nel php le select e le funzioni per estrarre i dati dal db

spero possa essere utile a qualcuno perchè alla fine non si è rivelato così banale.