Jump to content
TheRonaldoStar

Ajuda com Agrupamentos!

Recommended Posts

Olá. eu gostaria de saber como eu uso o "ORDER BY DESC" juntamente com o "GROUP BY", Atualmente eu tenho um projeto no qual ele faz o agrupamentos,

De cadastros, porem ao invés de listar o último registro de cada grupo ele lista somente o primeiro cadastro de cada grupo mesmo usando: ORDER BY id DESC

 

Este é o código usado;

$sql = $db -> prepare("SELECT * FROM privado WHERE Usuarios LIKE '%:$Meu_id:%' GROUP BY Usuarios ORDER BY id DESC");
$sql -> execute();

Obss: Ali em LIKE Busca o id do usuário online que esteja entre:  EX (:1:2:);

 

Por favor me ajudem com isso, preciso de ajuda com isto com urgência.

Atenciosamente,

~Ronaldo

Share this post


Link to post
Share on other sites

TheRonaldoStar

Primeiro existe um erro no entendimento dos comandos da sua clausula.

Você disse que o LIKE busca ENTRE, mas na verdade esta errado, ele não busca ENTRE e sim todos o conteudo na tabela que CONTENHA os caracteres.

 

Ex:

Tabela 1

Nome_Cliente

Felipe

Fabricio

Fernando

Guilherme

Jose

 

Se eu fizer uma busca utilizando o LIKE "%Fe%" o retorno será

Felipe e Fernando, porque nestas palavras existem "Fe" em seu conteúdo e isso só funciona para campos CHAR ou VARCHAR.

 

O comando que faz buscar ENTRE

Exemplo 1 até 10 (ou seja - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10) é o BETWEEN $valor_min AND $valor_max.

mas se você quer buscar, por exemplo os registros 1 E 2 apenas

Então neste caso você tem que usar o comando IN (1, 2)

 

Ficando com a clausula SQL assim para os casos.

 

BUSCAR REGISTROS ENTRE: 1 e 10 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10).

$id_min = 1;
$id_max = 10;
SELECT * FROM "Nome_Da_Tabela" WHERE "Campo_que_tem_o_valor ex: ID" BETWEEN ".$id_min." and ".$id_max." GROUP BY Usuarios ORDER BY id DESC

 

APENAS OS DIGITADOS: 1 e 10.

$id = "1, 10";
"SELECT * FROM "Nome_Da_Tabela" WHERE "Campo_que_tem_o_valor ex: ID" IN (".$id.") GROUP BY Usuarios ORDER BY id DESC"

 

QUE TENHAM CONTEUDO COM OS VALORES "1, 10" (CHAR ou VARCHAR).

$id = "1,10"; <-- para que isso funcione, você precisa ter uma coluna do tipo CHAR ou VARCHAR e no like
o campo precisa estar entre aspas simples para que o SQL entenda que é uma string.
"SELECT * FROM "Nome_Da_Tabela" WHERE "Campo_que_tem_o_valor ex: ID" LIKE '%".$id."%' GROUP BY Usuarios ORDER BY id DESC"

 

Fora isso man, os comandos GROUP BY e ORDER BY estão corretos, primeiro você defini o GROUP BY no select e depois o ORDER BY.

 

Se você tiver alguma dúvida e uma das opções acima não lhe ajudar, coloque aqui o nome da sua TABELA, nome dos CAMPOS que você quer buscar e uns 3 registro do conteudo desses campos:

 

Assim

Tabela: tb_cliente

Campos: cd_registro (INT), nm_cliente (VARCHAR (50)), id_sexo (CHAR (1)).

cd_registro, nm_cliente, id_sexo

1                   Felipe           M

2                   Fernando     M

3                   Carolina       F

 

Que ai fica mais claro montar a clausula para te explicar.

 

Para tirar a sua dúvida no entendimento recomendo olhar esses LINK:

Entendendo sobre BETWEEN

Entendendo sobre IN

Entendendo sobre LIKE

 

Espero ter ajudado.

 

Att.

Felipe Coutinho

Share this post


Link to post
Share on other sites

Oii, Felipe Guedes Coutinho

Obrigado pelo empenho à me ajudar mas no caso eu já uso o LIKE da mesma maneira que você citou acima e lista tudo normalmente mas o problema que estou tendo é que na hora que ele faz o agrupamento faz certinho mas ao invés agrupar todos os cadastros e mostrar somente o ultimo da listagem/Agrupamento ele mostra o primeiro, Ou seja o Order By id Desc não funciona.

EX:
[:1:2:] Oii
[:1:2:] Você pode me ajudar ?
[:1:2:] Sim pode falar :/

Ou seja que esta acontecendo é que ao invés de mostrar o (Sim pode falar :/) mostra o (Oii);

Share this post


Link to post
Share on other sites

TheRonaldoStar

Não estou conseguindo entender o seu problema por causa do seu exemplo.

 

MAS eu acho que você quer exibir a última mensagem enviada para uma pessoa no PRIVATE, estou certo?

Porque explicando o que acontece com o seu exemplo.

 

Se você tem uma tabela com o campo ID, USUARIO e a MENSAGEM:

Tabela: PRIVADO

ID.              USUARIO.              MENSAGEM

1                [:1:2:]                      Oii

2                [:1:2:]                      Você pode me ajudar ?

3                [:1:2:]                      Sim pode falar :/

 

O que acontece em ordem de execução do seu SELECT.

 

Primeiro: ele obtem todos os registros onde o USUARIO tenha [:1:2:] que no nosso caso são os 3 registros.

Segundo: ele usa o GROUP que vai nos resultar no 1 registro da tabela

Terceiro: inverter a ordem por causa do ORDER BY ID DESC.

 

Só que devido a ordem de comandos, o Group by elimina o registro 2 e 3 e quando ele vai ORDERNAR só existe 1 registro que é o de ID 1, por isso da a impressão de que o comando não funciona, mas o problema neste caso é a ordem de execução devido a estrutura da sua tabela.

 

DIGAMOS que o seu problema é exibir apenas a última dessas mensagens deste usuário 1:2.

Se for isso, recomendo você usar o SELECT sem o GROUP BY, colocando o ORDER BY e LIMITANDO a 1 registro.

 

ASSIM: SELECT * FROM privado WHERE Usuarios LIKE '%:$Meu_id:%' ORDER BY ID DESC LIMIT 1

 

Retornar a mensagem:

3                [:1:2:]                      Sim pode falar :/

 

AGORA SE você quer trazer todas as mensagem deste usuário você simplesmente usa o comando acima SEM O LIMITE

 

ASSIM: SELECT * FROM privado WHERE Usuarios LIKE '%:$Meu_id:%' ORDER BY ID DESC

 

Resultando em retornar todas as mensagem em ordem decrescente

3                [:1:2:]                      Sim pode falar :/

2                [:1:2:]                      Você pode me ajudar ?

1                [:1:2:]                      Oii

 

Agora se o seu problema não for nenhum desses casos que eu imaginei, preciso que você coloque aqui a sua tabela com os nomes dos campos e com os valores preenchidos e explique o que exatamente você quer exibir.

 

Obs.: Só queria deixar uma pergunta para você mesmo analisar, lembrando que a pesquisa utilizando o LIKE ele pega TODOS os registros que tenham os caracteres informados.

 

Exemplo:

TB_USUARIO

cod_user (Varchar 50)

1:1

1:2

1:3

...

1:20

1:21

1:22

 

Usando a tabela acima, se você utilizar uma pesquisa com LIKE passando 1:2 como a do seu exemplo

Os registros retornados serão: 1:2, 1:20, 1:21 e 1:22 e se eu tiver usuário 1:200 ou 1:201 ou 1:202 ou qualquer número 1:2xxxxxxxxxxxxx ele ira retornar.

 

Espero ter ajudado

 

Att

Felipe Coutinho

Share this post


Link to post
Share on other sites

#RESOLVIDO

 

QUERY

SELECT
	*
FROM
	Privado p1
INNER JOIN
	(
		SELECT
			MAX(pi.id) AS maxId
		FROM
			Privado PI
		GROUP BY
			pi.Usuarios
	) p2
ON
	( p1.id = p2.maxId )
WHERE
	p1.Usuarios LIKE '%1%'

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By dutopfave
      Boa Noite Galera, estou com dúvida em como cria um cadastra de VARIAÇÕES DE PRODUTOS.

      Ex.: Tenho um produto que é um TENIS, ai nele vou criar as VARIAÇÕES, então vou usa COR e TAMANHO.
      COR: preto, verde, azul
      TAMANHO: 39, 40, 41

      até ai blz, porém a duvida é como fazer o cadastrado de combinações de cor e tênis, tipo no banco de dados teria q fica exatamente assim....

      ID | COR | TAMANHO
      ... | preto | 39
      ... | preto | 40
      ... | preto | 41
      ... | verde | 39
      ... | verde | 40
      ... | verde | 41
      ... | azul | 39
      ... | azul | 40
      ... | azul | 41

      alguém tem alguma solução
    • By lucianfpaula
      Olá amigos, tenho uma duvida talvez simples mas não para mim hehehe. estou desenvolvendo um sistema onde a pessoa faz um cadastro simples mas preciso de uma função que não permita que a pessoa faça mais de um cadastro pelo dispositivo dela, tipo ela faz pelo celular dela com nome, email etc... mas preciso limitar o cadastro não apenas pelo email mas também pelo dispositivo, ou seja preciso de uma forma de identificar o aparelho para que não haja mais cadastro pelo mesmo dispositivo. Não sei se ficou claro minha duvida, alguém pode me ajudar? Muito grato
    • By RodrigoWD3
      Pessoal boa tarde, estou criando uma galeria com categorias no php e mysql, gostaria de saber como faço para colocar um botão -  Exibir Mais Fotos - fazendo exibir o restante dos registros na mesma pagina, teria alguma forma de limitar as fotos sem usar o LIMIT do sql? pode ser usando jQuery algo assim , obrigado
    • By Jack Oliveira
      Ola galera boa noite
      Pessoal preciso enviar um arquivo por e-mail, onde o sistema faz backups do banco de dados manual e automatico
       
      preciso que seja enviado apenas o sql que for gerado tanto manual quanto automatico
      ambos esta fazendo o backups normalmente sem problemas
       
      Segue o código a baixo
       
      <?php session_start(); require_once('../../database/config.php'); require_once('../../database/config.database..php'); require_once('../../includes/funcoes.php'); require_once('controller.php'); if (!is_dir('../../backups')) { @mkdir('../../backups', 0777, true); } $name_backup = "Backups_" . date("ymdHis"); $querySQL = DBCreate('backups', [ 'name' => "Banco_de_dados_" . $name_backup, 'type' => 'sql', 'status' => 'Iniciado' ], true); $queryZIP = DBCreate('backups', [ 'name' => "Arquivos_ZIP_" . $name_backup, 'type' => 'zip', 'status' => 'Iniciado' ], true); try { require_once("Mysqldump.php"); $dump = new Ifsnop\Mysqldump\Mysqldump('mysql:host=' . DB_HOSTNAME . ';dbname=' . DB_DATABASE . '', '' . DB_USERNAME . '', '' . DB_PASSWORD . ''); $dump->start("../../backups/Banco_{$name_backup}.sql"); if (file_exists("../../backups/Banco_{$name_backup}.sql")) { DBUpdate('backups', array('status' => 'concluido'), "id = '{$querySQL}'"); } } catch (\Exception $e) { $return = [ "title" => "Oops!", "msg" => "Erro ao exportar banco de dados.", "icon" => "error" ]; DBUpdate('backups', array('status' => 'Erro ao exportar banco de dados'), "id = '{$querySQL}'"); Redireciona('?erro'); } try { $filename = "Arquivos_ZIP_{$name_backup}.zip"; $rootPath = realpath('../../wa/'); $zip = new ZipArchive(); $zip->open("../../backups/$filename", ZipArchive::CREATE | ZipArchive::OVERWRITE); $files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($rootPath), RecursiveIteratorIterator::LEAVES_ONLY ); foreach ($files as $name => $file) { if (!$file->isDir()) { $filePath = $file->getRealPath(); $relativePath = substr($filePath, strlen($rootPath) + 1); $zip->addFile($filePath, $relativePath); } } $zip->close(); } catch (\Exception $e) { $return = [ "title" => "Oops!", "msg" => "Erro ao criar arquivo de backup no formato zip!", "icon" => "error" ]; DBUpdate('backups', array('status' => 'Erro ao criar arquivo de backup no formato zip'), "id = '{$queryZIP}'"); } DBUpdate('backups', array('status' => 'concluido'), "id = '{$queryZIP}'"); if (empty($return)) { $return = [ "title" => "Deu Certo!", "msg" => "Backup Realizado com Sucesso!", "icon" => "success" ]; } echo json_encode($return); if (!empty(getConfigBackup('mail_notify'))) { @require_once('../../controller/class.phpmailer/PHPMailerAutoload.php'); $mail = new PHPMailer(); $mail->CharSet = "UTF-8"; $mail->isSMTP(true); $mail->SMTPSecure = getConfigBackup('mail_seguranca'); $mail->Host = getConfigBackup('mail_host'); $mail->Username = getConfigBackup('mail_email'); $mail->Password = getConfigBackup('mail_senha'); $mail->Port = getConfigBackup('mail_porta'); $mail->From = getConfigBackup('mail_email'); $mail->FromName = ConfigPainel('site_nome'); $mail->Subject = "Seu Backup está pronto!"; if (strstr(getConfigBackup('mail_notify'), ';')) { $email = explode(';', getConfigBackup('mail_notify')); foreach ($email as $key => $value) { $mail->AddAddress($value); } } else { $mail->AddAddress(getConfigBackup('mail_notify')); } $dados = "Olá, o Backup do painel " . ConfigPainel('site_nome') . " foi realizado com sucesso. Ele está disponível em seu dashboard na área de backups. Acesse o Painel para Gerenciar seus backups."; $mail->Body = "<div id='m_-7598057918015146334m_-2331253013811829785wrapper' dir='ltr' style='background-color:#f7f7f7;margin:0;padding:70px 0 70px 0;width:100%'> <table border='0' cellpadding='0' cellspacing='0' height='100%' width='100%'> <tbody> <tr> <td align='center' valign='top'> <div id='m_-7598057918015146334m_-2331253013811829785template_header_image'></div> <table border='0' cellpadding='0' cellspacing='0' width='600' id='m_-7598057918015146334m_-2331253013811829785template_container' style='background-color:#ffffff;border:1px solid #dedede;border-radius:3px!important'> <tbody> <tr> <td align='center' valign='top'> <table border='0' cellpadding='0' cellspacing='0' width='600' id='m_-7598057918015146334m_-2331253013811829785template_header' style='background-color:#333333;border-radius:3px 3px 0 0!important;color:#ffffff;border-bottom:0;font-weight:bold;line-height:100%;vertical-align:middle;font-family:&quot;Helvetica Neue&quot;,Helvetica,Roboto,Arial,sans-serif'> <tbody> <tr> <td id='m_-7598057918015146334m_-2331253013811829785header_wrapper' style='padding:36px 48px;display:block'> <h1 style='color:#ffffff;font-family:&quot;Helvetica Neue&quot;,Helvetica,Roboto,Arial,sans-serif;font-size:30px;font-weight:300;line-height:150%;margin:0;text-align:left'>Backup Realizado com sucesso</h1> </td> </tr> </tbody> </table> </td> </tr> <tr> <td align='center' valign='top'> <table border='0' cellpadding='0' cellspacing='0' width='600' id='m_-7598057918015146334m_-2331253013811829785template_body'> <tbody> <tr> <td valign='top' id='m_-7598057918015146334m_-2331253013811829785body_content' style='background-color:#ffffff'> <table border='0' cellpadding='20' cellspacing='0' width='100%'> <tbody> <tr> <td valign='top' style='padding:48px'> <div id='m_-7598057918015146334m_-2331253013811829785body_content_inner' style='color:#636363;font-family:&quot;Helvetica Neue&quot;,Helvetica,Roboto,Arial,sans-serif;font-size:14px;line-height:150%;text-align:left'> <p style='margin:0 0 16px'></p> $dados </div> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> </div>"; $mail->IsHTML(true); $mail->Send(); $mail->ClearAllRecipients(); $mail->ClearAttachments(); } Lembrando so ser enviado o que for sql
      Ex: Banco_de_dados_Backups_210412193634.sql
      SQL_Backup_210412180942.sql
       
      Conforme for gerando o backups
      no create tem type sql
       
       
      Não sei isso vai ajudar em algo mais a tabela  backups esta assim
       
      INSERT INTO `backups` (`id`, `name`, `type`, `created_at`, `status`) VALUES (1, 'SQL_Backup_210412180942', 'sql', '2021-04-12 21:09:42', 'concluido'), (2, 'ZIP_Backup_210412180942', 'zip', '2021-04-12 21:09:42', 'Iniciado'), (3, 'Banco_de_dados_Backups_210412193634', 'sql', '2021-04-12 22:36:34', 'concluido'), (4, 'Arquivos_ZIP_Backups_210412193634', 'zip', '2021-04-12 22:36:34', 'Iniciado');  
       
      Se puderem da esta ajuda fico grato
    • By henriquers
      Estou com um problema com o Select2, ele tem um campo de busca mas não esta filtrando corretamente e não estou entendo o motivo, sem utilizar o AJAX colocando os options manualmente ele funciona corretamente, mas trazendo os dados via AJAX ele não funciona o campo de busca.
      Se aguem poder me dar uma luz agradeço a ajuda.
       

       
      Nessa imagem estou tentando filtrar apenas para os itens que tenha LUVA na descrição, mas não funciona, posso colocar qual quer coisa que ele não faz o filtro
       
      Abaixo segue meu codigo
       
      HTML
      <!DOCTYPE HTML PUBLIC> <HTML> <HEAD> <TITLE> Select2 </TITLE> <link href="select2/select2.css" rel="stylesheet" type="text/css" /> <script src="https://code.jquery.com/jquery-latest.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.5/js/i18n/pt-BR.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.5/js/select2.js"></script> <link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.5/css/select2.css" rel="stylesheet"/> <script> $(document).ready(function(){ $("#selUser").select2({ language: "pt-br", ajax: { url: "get_dados.php", type: "GET", dataType: 'json', delay: 200, data: function (params) { return { q: params.term, // search term page: params.page }; }, processResults: function (response) { return { results: response }; }, cache: true }, width: "20%", closeOnSelect: true, }); }); </script> </head> <body> <select id='selUser' style='width: 200px;'> <option value='0'>- Search user -</option> </select> </body> </html> get_dados.php
      <?php include './conn_orcl.php'; $select="SELECT PRO_CODPRO PRODUTO,TRIM(PRO_DESCRI) DESCRICAO FROM F_PRODS WHERE PRO_LOCEST='ALMOX' AND PRO_STATUS = 'AT' ORDER BY DESCRICAO"; $parse=oci_parse($conn,$select); oci_execute($parse); $data = array(); while($row=oci_fetch_array($parse)){ $data[] = array("id"=>$row['PRODUTO'], "text"=>$row['PRODUTO']." - ".$row['DESCRICAO']); }; echo json_encode($data); ob_end_flush(); oci_free_statement($parse); oci_close($conn); ?>  
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.