Ir para conteúdo

Arquivado

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

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

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros 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);

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros 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%'

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por violin101
      Caros amigos, saudações.
       
      Gostaria de tirar uma dúvida com os amigos.
       
      Quando programava em DOS. utilizava algumas teclas de atalho para: SALVAR / EDITAR / EXCLUIR / IMPRIMIR.
      Por exemplo:
      Salvar ----> ALT+S
      Editar ----> ALT+E
      Excluir --> ALT+X
      Imprimir -> ALT+I

      no PHP tem como colocar esses ATALHOS nos button, para o usuário trabalhar com esses atalhos e como seria ?

      grato,
       
      Cesar
    • Por violin101
      Caros Amigos, saudações.
       
      Por favor, me perdoa em postar uma dúvida.
       
      Preciso criar uma Rotina onde o usuário possa buscar na Base de Dados de Produtos, tanto por Código e Descrição, ou seja:
      - caso o usuário digita o Código, mostra os dados do Produto.
      - caso o usuário digita a Descrição, mostra os dados do Produto
       
      Fiz uma Rotina, onde o usuário digita a DESCRIÇÃO com a função AUTOCOMPLETE.    <=== está funcionando certinho.
       
      Minha dúvida é como faço para DIGITAR o Código e mostrar os dados também.
       
      o meu AutoComplete na MODEL está assim.
      public function autoCompleteProduto($q){ $this->db->select('*' ) ->from('produtos') ->where('produtos.statusProd',1) ->like('descricao', $q) ->limit(5) ->order_by('descricao', 'ASC'); $query = $this->db->get(); if ($query->num_rows() > 0) { foreach ($query->result_array() as $row) { $row_set[] = ['label' => str_pad($row['idProdutos'], '5', '0', STR_PAD_LEFT).' - '.$row['descricao'], 'id' => $row['idProdutos'], 'descricao' => $row['descricao'], 'cod_interno' => $row['cod_interno'], 'prd_unid' => $row['prd_unid'], 'estoque_atual' => $row['estoque_atual'] ]; } echo json_encode($row_set); } }  
       
      no CONTROLLER está assim:
      public function autoCompleteProduto() { $this->load->model('estoque/lancamentos_model'); if (isset($_GET['term'])) { $q = strtolower($_GET['term']); $this->lancamentos_model->autoCompleteProduto($q); } }  
       
      na VIEW está assim:
      <div class="col-md-10"> <label for="idProdutos">Produto:</label> <input type="hidden" name="idProdutos" id="idProdutos"> <input type="text" class="form-control" id="descricao" name="descricao" style="font-size:15px; font-weight:bold;" placeholder="Pesquisar por descrição do produto" disabled> </div>  
      VIEW + JAVASCRIPT
       
      //Função para trazer os Dados pelo o AutoComplete. function resolveAutocomplete() { $("#descricao").autocomplete({ source: "<?php echo base_url(); ?>estoque/lancamentos/autoCompleteProduto/", minLength: 2, select: function (event, ui) { $("#idProdutos").val(ui.item.id); $("#cod_interno").val(ui.item.cod_interno); $("#descricao").val(ui.item.descricao); $("#prd_unid").val(ui.item.prd_unid); $("#estoque_atual").val(ui.item.estoque_atual); $("#qtde").focus(); } }); } // inicia o autocomplete resolveAutocomplete();  
      Grato,
       
      Cesar
    • Por belann
      Olá!
       
      Estou tentando criar um projeto laravel e está dando o seguinte erro 
      curl error 60 while downloading https://getcomposer.org/versions: SSL certificate problem: unable to get local issu
        er certificate
      Já tentei atualizar o composer, mas dá o mesmo erro acima.
    • Por violin101
      Caros amigos, saudações.
       
      Estou com uma dúvida de validação de INPUT com função moeda.
       
      Tenho um input onde o usuário digita um valor qualquer, por exemplo: 1.234,56
      o problema é quando precisa atualizar o valor.
       
      Quando o usuário atualizar o input fica assim: 1.234,
       
      como faço para atualizar as casas decimais, conforme o valor for sendo alterado ?
       
      o input está assim:
       
      <div class="col-md-2"> <label for="">Valor Unitário</label> <input type="text" class="form-control" id="estoqprod" name="estoqprod" style="font-size:15px; font-weight:bold; width:100%; text-align:center;" placeholder="0,00" OnKeyUp="calcProd();" onkeypress="return(FormataMoeda(this,'.',',',event))" > </div>  
      a função para formatar o input para moeda está assim:
      obs.: a Função CalcProd está executando corretamente
      function calcProd(){ //Obter valor digitado do produto var estoq_prod = document.getElementById("estoqprod").value; //Remover ponto e trocar a virgula por ponto while (estoq_prod.indexOf(".") >= 0) { estoq_prod = estoq_prod.replace(".", ""); } estoq_prod = estoq_prod.replace(",","."); //Obter valor digitado do produto var prod_qtde = document.getElementById("qtde").value; //Remover ponto e trocar a virgula por ponto while (prod_qtde.indexOf(".") >= 0) { prod_qtde = prod_qtde.replace(".", ""); } prod_qtde = prod_qtde.replace(",","."); //Calcula o Valor do Desconto if (prod_qtde > 0 && estoq_prod > 0) { calc_total_produto = parseFloat(prod_qtde) - parseFloat(estoq_prod); var numero = calc_total_produto.toFixed(2).split('.'); //Calculo para não deixar GRAVAR valores negativos if (calc_total_produto < 0 ) { numero[0] = numero[0].split(/(?=(?:...)*$)/).join('.') * -1; document.getElementById("qtdeTotal").value = numero.join(','); } else { numero[0] = numero[0].split(/(?=(?:...)*$)/).join('.'); document.getElementById("qtdeTotal").value = numero.join(','); } } else { if (estoq_prod > 0) { document.getElementById("qtdeTotal").value = document.getElementById("estoqprod").value; } else { document.getElementById("qtdeTotal").value = "0,00"; } } } /*---Função para Formatar Campo para Moeda [R$]---*/ function FormataMoeda(objTextBox, SeparadorMilesimo, SeparadorDecimal, e){ var sep = 0; var key = ''; var i = j = 0; var len = len2 = 0; var strCheck = '0123456789'; var aux = aux2 = ''; var whichCode = (window.Event) ? e.which : e.keyCode; if (whichCode == 13) return true; key = String.fromCharCode(whichCode); // Valor para o código da Chave if (strCheck.indexOf(key) == -1) return false; // Chave inválida len = objTextBox.value.length; for(i = 0; i < len; i++) if ((objTextBox.value.charAt(i) != '0') && (objTextBox.value.charAt(i) != SeparadorDecimal)) break; aux = ''; for(; i < len; i++) if (strCheck.indexOf(objTextBox.value.charAt(i))!=-1) aux += objTextBox.value.charAt(i); aux += key; len = aux.length; if (len == 0) objTextBox.value = ''; if (len == 1) objTextBox.value = '0'+ SeparadorDecimal + '0' + aux; if (len == 2) objTextBox.value = '0'+ SeparadorDecimal + aux; if (len > 2) { aux2 = ''; for (j = 0, i = len - 3; i >= 0; i--) { if (j == 3) { aux2 += SeparadorMilesimo; j = 0; } aux2 += aux.charAt(i); j++; } objTextBox.value = ''; len2 = aux2.length; for (i = len2 - 1; i >= 0; i--) objTextBox.value += aux2.charAt(i); objTextBox.value += SeparadorDecimal + aux.substr(len - 2, len); } return false; }  
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Estou com uma dúvida de validação de INPUT com função moeda.
       
      Tenho um input onde o usuário digita um valor qualquer, por exemplo: 1.234,56
      o problema é quando precisa atualizar o valor.
       
      Quando o usuário atualizar o input fica assim: 1.234,
       
      como faço para atualizar as casas decimais, conforme o valor for sendo alterado ?
       
      o input está assim:
       
      <div class="col-md-2"> <label for="">Valor Unitário</label> <input type="text" class="form-control" id="estoqprod" name="estoqprod" style="font-size:15px; font-weight:bold; width:100%; text-align:center;" placeholder="0,00" OnKeyUp="calcProd();" onkeypress="return(FormataMoeda(this,'.',',',event))" > </div>  
      a função para formatar o input para moeda está assim:
      obs.: a Função CalcProd está executando corretamente
      function calcProd(){ //Obter valor digitado do produto var estoq_prod = document.getElementById("estoqprod").value; //Remover ponto e trocar a virgula por ponto while (estoq_prod.indexOf(".") >= 0) { estoq_prod = estoq_prod.replace(".", ""); } estoq_prod = estoq_prod.replace(",","."); //Obter valor digitado do produto var prod_qtde = document.getElementById("qtde").value; //Remover ponto e trocar a virgula por ponto while (prod_qtde.indexOf(".") >= 0) { prod_qtde = prod_qtde.replace(".", ""); } prod_qtde = prod_qtde.replace(",","."); //Calcula o Valor do Desconto if (prod_qtde > 0 && estoq_prod > 0) { calc_total_produto = parseFloat(prod_qtde) - parseFloat(estoq_prod); var numero = calc_total_produto.toFixed(2).split('.'); //Calculo para não deixar GRAVAR valores negativos if (calc_total_produto < 0 ) { numero[0] = numero[0].split(/(?=(?:...)*$)/).join('.') * -1; document.getElementById("qtdeTotal").value = numero.join(','); } else { numero[0] = numero[0].split(/(?=(?:...)*$)/).join('.'); document.getElementById("qtdeTotal").value = numero.join(','); } } else { if (estoq_prod > 0) { document.getElementById("qtdeTotal").value = document.getElementById("estoqprod").value; } else { document.getElementById("qtdeTotal").value = "0,00"; } } } /*---Função para Formatar Campo para Moeda [R$]---*/ function FormataMoeda(objTextBox, SeparadorMilesimo, SeparadorDecimal, e){ var sep = 0; var key = ''; var i = j = 0; var len = len2 = 0; var strCheck = '0123456789'; var aux = aux2 = ''; var whichCode = (window.Event) ? e.which : e.keyCode; if (whichCode == 13) return true; key = String.fromCharCode(whichCode); // Valor para o código da Chave if (strCheck.indexOf(key) == -1) return false; // Chave inválida len = objTextBox.value.length; for(i = 0; i < len; i++) if ((objTextBox.value.charAt(i) != '0') && (objTextBox.value.charAt(i) != SeparadorDecimal)) break; aux = ''; for(; i < len; i++) if (strCheck.indexOf(objTextBox.value.charAt(i))!=-1) aux += objTextBox.value.charAt(i); aux += key; len = aux.length; if (len == 0) objTextBox.value = ''; if (len == 1) objTextBox.value = '0'+ SeparadorDecimal + '0' + aux; if (len == 2) objTextBox.value = '0'+ SeparadorDecimal + aux; if (len > 2) { aux2 = ''; for (j = 0, i = len - 3; i >= 0; i--) { if (j == 3) { aux2 += SeparadorMilesimo; j = 0; } aux2 += aux.charAt(i); j++; } objTextBox.value = ''; len2 = aux2.length; for (i = len2 - 1; i >= 0; i--) objTextBox.value += aux2.charAt(i); objTextBox.value += SeparadorDecimal + aux.substr(len - 2, len); } return false; }  
      Grato,
       
      Cesar
×

Informação importante

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