Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

empirerock

Tentando fazer inner join em Datatable

Recommended Posts

Pessoal, boa tarde.

Estou usando o Datatable server-side-processing, porém estou tentando fazer um inner join com 2 tabelas, más está dando erro nesta linha: $queryRecords = mysqli_query($conn, $sqlRec) or die("erro queryRecords");

Segue código abaixo. Agradeço a quem puder me ajudar. Abraço!

<?php

	include_once("connection.php");

	$params = $columns = $totalRecords = $data = array();

	$params = $_REQUEST;

	$columns = array( 
		0 =>'dia'.'id',
		1 =>'dia'.'data_abertura',
		2 =>'dia'.'data_liberacao',
		3 =>'dia'.'data_montagem',
		4 =>'dia'.'codiks', 
		5 =>'dia'.'planejador',
		6 =>'dia'.'op'
		);

	$where = $sqlTot = $sqlRec = "";

	if( !empty($params['search']['value']) ) {   
		$where .=" WHERE ";
		$where .=" ( data_abertura LIKE '".$params['search']['value']."%' ";    
		$where .=" OR codiks LIKE '".$params['search']['value']."%' ";
		$where .=" OR planejador LIKE '".$params['search']['value']."%' )";
	}


	$sql = "SELECT * FROM `dia` INNER JOIN `estf004` ON (`dia`.`codiks` = `estf004`.`codiks`) "; 

	$sqlTot .= $sql;
	$sqlRec .= $sql;

	if(isset($where) && $where != '') {

		$sqlTot .= $where;
		$sqlRec .= $where;
	}


	$sqlRec .=  " ORDER BY ". $columns[$params['order'][0]['column']]."   ".$params['order'][0]['dir']."  LIMIT ".$params['start']." ,".$params['length']." ";

	$queryTot = mysqli_query($conn, $sqlTot) or die("database error:". mysqli_error($conn));
	$totalRecords = mysqli_num_rows($queryTot);



	$queryRecords = mysqli_query($conn, $sqlRec) or die("erro queryRecords");


	while( $row = mysqli_fetch_row($queryRecords) ) { 
		$data[] = $row;

		
	}	

	$json_data = array(
		"draw"            => intval( $params['draw'] ),   
		"recordsTotal"    => intval( $totalRecords ),  
		"recordsFiltered" => intval($totalRecords),
		"data"            => $data   
		);

	echo json_encode($json_data); 
	?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

DataTable é uma biblioteca client-side que utiliza recursos server-side. A consulta continua tendo limítrofes de uma consulta SQL em um SGBD MySQL.

Vai ficar mais fácil te ajudar se informar qual é o erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado por responder.

Esse problema, após muito fuçar, consegui acertar o inner join.

Meu problema agora é outro.

------------------------------------------------------------------------------------

Preciso tirar a diferença entre duas datas (data_abertura e data_liberação), para exibir em uma coluna do Datatable. Porém está dando esse erro:

Notice: Undefined index: date_difference in /var/www/producao/response.php on line 70

No banco, existem linhas onde a data_liberação não possui data, no caso 0000-00-00, e imagino que possa ser esse o motivo desse erro.

Mais uma vez agradeço a quem ajudar.

Segue o código abaixo:

<?php
	
	include_once("connection.php");	 	
	$params = $columns = $totalRecords = $data = array();

	$params = $_REQUEST;	
	$columns = array( 
		
		0 =>'`u`.`id`',
		1 =>'`u`.`data_abertura`',
		2 =>'`u`.`data_liberacao`',
		3 =>'`u`.`data_montagem`',
		4 =>'`u`.`codiks`',
		5 => '`u`.`planejador`',
		
		
	);

	$where = $sqlTot = $sqlRec = "";

	// check search value exist
	if( !empty($params['search']['value']) ) {   
		$where .=" WHERE ";
		$where .=" ( u.data_abertura LIKE '".$params['search']['value']."%' )";    
		$where .=" OR u.data_liberacao LIKE '".$params['search']['value']."%' ";
		$where .=" OR u.data_montagem LIKE '".$params['search']['value']."%' ";
		$where .=" OR u.codiks LIKE '".$params['search']['value']."%' ";
		$where .=" OR u.planejador LIKE '".$params['search']['value']."%' ";
		
	}
	
	$sql = "SELECT *, DATEDIFF(data_abertura, data_liberacao) AS date_difference FROM `dia` AS `u` INNER JOIN `estf004` AS `ud` ON (`ud`.`codiks` = `u`.`codiks`)";
	
	$sqlTot .= $sql;
	$sqlRec .= $sql;
	
	if(isset($where) && $where != '') {

		$sqlTot .= $where;
		$sqlRec .= $where;
	}

 	$sqlRec .=  " ORDER BY ". $columns[$params['order'][0]['column']]."   ".$params['order'][0]['dir']."  LIMIT ".$params['start']." ,".$params['length']." ";
	$queryTot = mysqli_query($conn, $sqlTot) or die("database error:". mysqli_error($conn));

	$totalRecords = mysqli_num_rows($queryTot);
	$queryRecords = mysqli_query($conn, $sqlRec);


	while( $row = mysqli_fetch_row($queryRecords) ) { 				
		
		$result1 = $row[0];
		$result2 = $row[1];
		$result3 = $row[2];
		$result4 = $row[3];
		$result5 = $row[4];
		$result6 = $row[5];

/***************************ESSA É A LINHA DO ERRO********************************************/
		$result7 = $row['date_difference']; //Esta é a linha do erro (linha 70)		
/********************************************************************************************/				
	}		

		$data[] = array($result1, $result2,  $result3, $result4,  $result5, $result6, $result7);
		


	$json_data = array(
			"draw"            => intval( $params['draw'] ),   
			"recordsTotal"    => intval( $totalRecords ),  
			"recordsFiltered" => intval($totalRecords),
			"data"            => $data   
			);

	echo json_encode($json_data);  
?>
	

Compartilhar este post


Link para o post
Compartilhar em outros sites

Do manual: http://php.net/manual/en/mysqli-result.fetch-row.php

mysqli_result::fetch_row -- mysqli_fetch_rowGet a result row as an enumerated array

O que você possui na linha 70 é um array associativo e o que a função retorna é um array indexado. Logo, a key abaixo não existe:

$result7 = $row['date_difference'];

Substitua a função mysqli_fetch_row por mysqli_fetch_array

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gabriel, era isso mesmo. Alterei a linha como você falou e funcionou. Muito Obrigado.

Tô quase finalizando, más só estou com um problema.

Não estou conseguindo fazer com que o Datatable faça busca na coluna onde está o date_difference.

Simplesmente não mostra nada quando tento buscar algo que tenha nesta coluna.

Imagino que o problema esteja na linha que está identificada abaixo no script, no qual não consigo acertar.

Abraço!


<?php
	
	include_once("connection.php");
	 
		$params = $columns = $totalRecords = $data = array();

	$params = $_REQUEST;

	$columns = array( 
		0 =>'`u`.`id`',
		1 =>'`u`.`data_abertura`',
		2 =>'`u`.`data_liberacao`',
		3 =>'`u`.`data_montagem`',
		4 =>'`u`.`codiks`',
		5 => '`u`.`planejador`',
		
	);

	

	$where = $sqlTot = $sqlRec = "";

	if( !empty($params['search']['value']) ) {   
		$where .=" WHERE ";
		$where .=" ( u.data_abertura LIKE '".$params['search']['value']."%' )";    
		$where .=" OR u.data_liberacao LIKE '".$params['search']['value']."%' ";
		$where .=" OR u.data_montagem LIKE '".$params['search']['value']."%' ";
		$where .=" OR u.codiks LIKE '".$params['search']['value']."%' ";
		$where .=" OR u.planejador LIKE '".$params['search']['value']."%' ";
		
/************* acho que o problema é aqui, más não sei como resolver ****************/            
    $where .=" OR 'date_difference' LIKE '".$params['search']['value']."%' ";
	}

	
	$sql = "SELECT *, DATEDIFF(data_liberacao, data_abertura) AS date_difference FROM `dia` AS `u` INNER JOIN `estf004` AS `ud` ON (`ud`.`codiks` = `u`.`codiks`)";

	$sqlTot .= $sql;
	$sqlRec .= $sql;
	
	if(isset($where) && $where != '') {

		$sqlTot .= $where;
		$sqlRec .= $where;
	}


 	$sqlRec .=  " ORDER BY ". $columns[$params['order'][0]['column']]."   ".$params['order'][0]['dir']."  LIMIT ".$params['start']." ,".$params['length']." ";

	$queryTot = mysqli_query($conn, $sqlTot) or die("database error:". mysqli_error($conn));


	$totalRecords = mysqli_num_rows($queryTot);

	$queryRecords = mysqli_query($conn, $sqlRec) or die("error to fetch employees data");

	
	while( $row = mysqli_fetch_array($queryRecords) ) { 
		

		$result1 = $row[0];
		$result2 = $row[1];
		$result3 = $row[2];
		$result4 = $row[3];
		$result5 = $row[4];
		$result6 = $row[5];	
		$result7 = $row['date_difference'];

	$data[] = array($result1, $result2,  $result3, $result4,  $result5, $result6, $result7);

	}	

	$json_data = array(
			"draw"            => intval( $params['draw'] ),   
			"recordsTotal"    => intval( $totalRecords ),  
			"recordsFiltered" => intval($totalRecords),
			"data"            => $data   // total data array
			);

	echo json_encode($json_data);  // send data as json format
?>
	

Compartilhar este post


Link para o post
Compartilhar em outros sites

Provavelmente deve adicionar a nova coluna na variável $columns e na própria consulta SQL.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, coloquei, más não sei se de maneira correta.

Eu coloquei na variável $columns na posição 6.

E também na última linha do $where, só que não vai.

Puts que se eu resolver esse lance da busca nesta coluna, resolvo 100% dos problemas. rs.

Valeu Abraço!

$columns = array( 
		0 =>'`u`.`id`',
		1 =>'`u`.`data_abertura`',
		2 =>'`u`.`data_liberacao`',
		3 =>'`u`.`data_montagem`',
		4 =>'`u`.`codiks`',
		5 => '`u`.`planejador`',
		6 => '`u`.`date_difference`',
		
	);

	

	$where = $sqlTot = $sqlRec = "";

	if( !empty($params['search']['value']) ) {   
		$where .=" WHERE ";
		$where .=" ( u.data_abertura LIKE '".$params['search']['value']."%' )";    
		$where .=" OR u.data_liberacao LIKE '".$params['search']['value']."%' ";
		$where .=" OR u.data_montagem LIKE '".$params['search']['value']."%' ";
		$where .=" OR u.codiks LIKE '".$params['search']['value']."%' ";
		$where .=" OR u.planejador LIKE '".$params['search']['value']."%' ";
		$where .=" OR u.date_difference LIKE '".$params['search']['value']."%' ";
	}

	
	$sql = "SELECT *, DATEDIFF(data_liberacao, data_abertura) AS date_difference FROM `dia` AS `u` INNER JOIN `estf004` AS `ud` ON (`ud`.`codiks` = `u`.`codiks`)";

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema está na seu WHERE. Você adicionou u.date_difference.

Por partes:
- 'u' é o alias da tabela 'dia';
- date_difference é o alias do resultado de uma função.

Logo, a referência está errada. Você deve colocar a mesma função no where:

"SELECT
    DATEDIFF(start , end)
FROM
    table
WHERE
    DATEDIFF(start , end) = 'clausula'";

ou em um subselect:

"SELECT * FROM (
    SELECT
        DATEDIFF(start , end) as datediff
    FROM
        table
) as result
WHERE 
    result.datediff = 'clausula'";

Vai depender do que tu achar mais "conveniente"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia.

Eu entendi que na clausula where, também tem que ter esta função, porém tentei de várias formas na váriavel $columns colocar o nome diff criado na clausula where.

Coloquei um com '`u`', sem u, de toda maneira possível, más sem sucesso.

Ainda não consegui resolver isso.

Quem puder contribuir, agradeço a força. Ainda sou novato em programação php com javascript. rs

Abraço a todos.

$columns = array( 
		0 =>'`u`.`id`',
		1 =>'`u`.`data_abertura`',
		2 =>'`u`.`data_liberacao`',
		3 =>'`u`.`data_montagem`',
		4 =>'`u`.`codiks`',
		5 => '`u`.`planejador`',
		6 => '`u`.`diff`',

	);



	$where = $sqlTot = $sqlRec = "";

	if( !empty($params['search']['value']) ) {   
		$where .=" WHERE ";
		$where .=" ( u.data_abertura LIKE '".$params['search']['value']."%' )";    
		$where .=" OR u.data_liberacao LIKE '".$params['search']['value']."%' ";
		$where .=" OR u.data_montagem LIKE '".$params['search']['value']."%' ";
		$where .=" OR u.codiks LIKE '".$params['search']['value']."%' ";
		$where .=" OR u.planejador LIKE '".$params['search']['value']."%' ";		
		$where .=" OR DATEDIFF(data_liberacao, data_abertura) = 'diff' LIKE '".$params['search']['value']."%' ";
	}


	$sql = "SELECT *, DATEDIFF(data_liberacao, data_abertura) AS date_difference FROM `dia` AS `u` INNER JOIN `estf004` AS `ud` ON (`ud`.`codiks` = `u`.`codiks`)";

Compartilhar este post


Link para o post
Compartilhar em outros sites

O u não pode ter. Ele é um apelido de uma tabela, a função não é uma coluna de uma tabela.

Aqui:

$where .=" OR DATEDIFF(data_liberacao, data_abertura) = 'diff' LIKE '".$params['search']['value']."%' ";

Você possui um = 'diff' e logo depois um LIKE. Você deve usar igual ou LIKE, não ambos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nossa, matou a pau.

Era só tirar o diff e colocar o DATEDIFF na posição 6 que deu certo.

Muito obrigado pela ajuda.

Abraço!

6 => '`DATEDIFF`',

$where .=" OR DATEDIFF(data_liberacao, data_abertura) LIKE '".$params['search']['value']."%' ";

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por Jack Oliveira
      Ola pessoal tarde ou boa noite 
       
      É o seguinte tenho mais de 10 mil registro no banco de dados, no DATATABLE esta demorando um pouco para fazer o carregamento destas informações
      o tempo varia entre 16 á 20, 25 segundos para obter uma resposta.
       
      Queria que esta resposta pudessem ser mais rápida, se teria como claro ela ser mais rápida possível...
       
      Fiz um novo teste quantidade de arquivos 1mil arquivos a resposta é bem rapida não demora nem 3 segundo 
       
      Estou usando via ajax e json
       
      <script type="text/javascript"> $(function () { $("#DataTableAjaxDT").DataTable({ "pageLength": 20, "paging": true, "lengthChange": true, "ajax": "ajax/registros.php", "searching": true, "aLengthMenu": [ [5, 10, 15, 20, 25, 30, 35, -1], [5, 10, 15, 20, 25, 30, 35, "Todos"] ], "ordering": true, "info": true, "autoWidth": true, "columnDefs": [{ "targets": 'no-sort', "orderable": false, }], "language": { "sEmptyTable": "Nenhum registro encontrado", "sInfo": "Mostrando de _START_ até _END_ de _TOTAL_ registros", "sInfoEmpty": "Mostrando 0 até 0 de 0 registros", "sInfoFiltered": "(Filtrados de _MAX_ registros)", "sInfoPostFix": "", "sInfoThousands": ".", "sLengthMenu": "Mostrar _MENU_ resultados por página", "sLoadingRecords": "Carregando...", "sProcessing": "Processando...", "sZeroRecords": "Nenhum registro encontrado", "sSearch": "Pesquisar", "oPaginate": { "sNext": "Próximo", "sPrevious": "Anterior", "sFirst": "Primeiro", "sLast": "Último" }, "oAria": { "sSortAscending": ": Ordenar colunas de forma ascendente", "sSortDescending": ": Ordenar colunas de forma descendente" } } }); }); </script>  
       
       
       
    • Por DuduBacteria
      Olá,
      table = $('.dataTable').DataTable({ 'destroy':true, 'ajax':{ 'url':DIRPAGE + '/painel/exibir-brinde/todos', 'method':'GET', 'dataSrc':'' }, 'columns':[ {'data':'nome'}, {'data':'doc'}, {'data':'brinde'}, {'data':'data'}, {'data':'empresa'}, {'defaultContent':'<td class="id"><button class="btn btn-success btn-resgatar" value="id_usuario" id_brinde="id_brinde"><i class="fas fa-plus-circle"></i> Resgatar </button></td>'} ] });  
    • Por aw10home
      Quando faço a consulta no phpMyadmim consigo o resultado esperado. Mas pelo visto não estou sabendo fazer direito em PHP. O que estou errando? Porque não consigo fazer a média (prtm) "aparecer"?
      abaixo meu código.
      <?php if (isset($_GET['$id_aluno'])){ $id_aluno = addslashes($_GET['$id_aluno']);} elseif (isset($_GET['id_aluno'])){ $id_aluno = addslashes($_GET['id_aluno']);}//addslashes evita sqlinjection else{ $id_aluno=(""); } $informacao=$con->prepare("SELECT a.id_aluno, a.nome, SUM(((b.prt*5)+(m.prt*3)+(v.prt*2))/10 ) as prtm FROM aluno a inner join avb1 b on a.id_aluno = b.id_aluno inner join avm2 m on a.id_aluno = m.id_aluno inner join avp v on a.id_aluno = v.id_aluno group by a.id_aluno, a.nome WHERE a.id_aluno = $id_usuario"); $informacao->execute(); ?> <!------------> <table class="cBolt"> <tr> <td>Avaliação</td> <td>Bim.</td> <td>Português</td> </tr> <?php while($linha=$informacao->fetch(PDO::FETCH_ASSOC)){ ?> <tr> <td>Média</td> <td>1º</td> <td><?php echo $linha['prtm'];?></td> </tr> <?php } ?> </table>  
    • Por lucianfpaula
      Galera tenha a seguinte duvida, tenho 3 tabelas onde estou trazendo os dados e preciso fazer um count em uma delas
       
      SELECT *  FROM tabela1 AS t1  INNER JOIN tabela2 AS t2 ON t1.idt1 = t2.idt2 INNER JOIN tabela3 AS t3 ON t3.idt3 = t1.idt1  
      a duvida é: quero manter o SELECT * mas também preciso de COUNT(t3.idT3)
      não sei se é possível fazer isso, mas gostaria de ter certeza antes de focar em outra solução
      desde já muito grato.
    • Por Jack Oliveira
      Ola pessoa se a minha duvida estiver no topic errado pessoa desculpas
       
      Mais é o seguinte fiz uns arquivos formato json funciona perfeitamente 
      porem alguns deles tem opção de abrir modal para cadastro e edição
       
      mais eles não esta abrindo DataTable
       
      Se eu fazer sem usar datatable direto no arquivo ele abre
       
      o script esta da seguinte forma
      <script type="text/javascript"> $(function () { $("#DataTableAjax").DataTable({ "pageLength": 25, "processing": true, "serverSide": true, "ajax": "ajax/<?php echo $UrlPage; ?>", "aLengthMenu": [ [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 100, -1], [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 100, "Todos"] ], "paging": true, "lengthChange": true, "searching": true, "ordering": true, "info": true, "autoWidth": true, "columnDefs": [{ "targets": 'no-sort', "orderable": false, }], "language": { "sEmptyTable": "Nenhum registro encontrado", "sInfo": "Mostrando de _START_ até _END_ de _TOTAL_ registros", "sInfoEmpty": "Mostrando 0 até 0 de 0 registros", "sInfoFiltered": "(Filtrados de _MAX_ registros)", "sInfoPostFix": "", "sInfoThousands": ".", "sLengthMenu": "Mostrar _MENU_ resultados por página", "sLoadingRecords": "Carregando...", "sProcessing": "Processando...", "sZeroRecords": "Nenhum registro encontrado", "sSearch": "Pesquisar", "oPaginate": { "sNext": "Próximo", "sPrevious": "Anterior", "sFirst": "Primeiro", "sLast": "Último" }, "oAria": { "sSortAscending": ": Ordenar colunas de forma ascendente", "sSortDescending": ": Ordenar colunas de forma descendente" } } }); }); </script> Bom acho que o arquivo a seguir não tem nada a ver, mais irei colocar mesmo assim. Na parte onde se o arquivo ajax/lojas.php que seria em formato json
      esta assim
       
      <?php return ob_get_clean(); } ), array( 'db' => 'id_empresa', 'dt' => 10, 'formatter' => function ($id_empresa, $row) { ob_start(); $ImprimirPermissao = GetPermissaoAcesso(); ?> <?php if (checkPermissao($ImprimirPermissao, 'lojas', 'produto', 'renovar')) { ?> <a class="btn btn-primary" href="#" data-toggle="modal" data-target="#modalRenovar_<?= $row['id_empresa'];?>"><i title="Nova data de renovação" class="fa fa-calendar" aria-hidden="true"></i></a> <?php } ?>  
      Modal assim
       
      <?php $Query = DBRead('lojas','*'); if (is_array($Query)) { foreach ($Query as $dados) { ?> <div class="modal fade" id="modalRenovar_<?= $id_empresa;?>" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> <div class="modal-dialog modal-lg" role="document"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button> <h4 class="modal-title" id="myModalLabel"><b>LOJA: </b><?= $nome_empresa;?></h4> </div> <div class="modal-body"> <form method="post" action="?AtualizarEmpresa=<?= $id_empresa; ?>" enctype="multipart/form-data"> <div class="form-group"> <label>Nova data:</label> <input class="form-control" type="date" name="empresa_data_renovacao" required placeholder="00/00/0000"> </div> </div> <div class="modal-footer"> <input type="hidden" name="user_id" value="<?=$user_id;?>"> <center><hr> <button class="btn btn-primary">Atualizar</button> <br><br> </center> </form> </div> <div class="modal-footer"> </div> </div> </div> </div> <?php }} ?>  
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.