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.

      Por favor, peço desculpa em recorrer a ajuda dos amigos referente uma dúvida.

      Tenho um Sistema que estou escrevendo em PHP + Codeigniter e a minha dúvida em Codeigniter é:
      Obs.: as tabela são em MySql

      => como faço para IMPORTAR o dado de uma Tabela para outra, as tabela são:
      ___________________Tabela de Pedido     =========== para ==========>    Tabela de Entrada de Lançamentos
      itens: codigoProduto | quantidade | valorUnitario  === importar===> itens: codigoProduto | quantidade | valorUnitario
       
      Estou tentando de várias formas, mas não estou conseguindo.

      Por favor, alguém pode me dar uma ajuda, explicação ou orientação.

      Grato,
       
      Cesar
       
    • Por violin101
      Caros amigos, saudações.
       
      Estou com uma pequena dúvida que não estou conseguindo resolver.

      Tenho 2 Tabelas, a 1ª.principal e a 2ª.secundária.

      Exemplo:
      Dados da 1ª Tabela - Peças e Equipamentos
      Dados da 2ª Tabela - Veículos.

      Seria isso:
      0010 - Pneu Aro 20
        [x] 001 - Corsa
        [_] 002 - Fusca
        [_] 003 - Palio
      Comentário:________________
       
      0100 - Óleo para Motor
         [x] 002 - Fusca
         [_] 003 - Palio
      Comentário:________________
       
      1030 - Lubrificante
         [_] 001 - Corsa
         [x] 003 - Palio
      Comentário:________________
       
      O meu problema está sendo quando preciso SALVAR/ATERAR o campo COMENTÁRIO, pois trata-se da 1ª.tabela.
       
      Gostaria salvar o COMENTÁRIO sem interferir nas seleção da 2ª. tabela.
       
      Grato,
       
      Cesar
       
       
       
       
       
    • Por Carcleo
      Estou começando no Laravel 11 e me deparei com um problema de belongsTo
       
      public function listOfClass(Request $request, StudentDisciplineClassroom $sdc) : ?string {         $all = $sdc::select('student')->with('studentRelation')->where('classroom',$request->classroom)->distinct('student')->get();     dd($all->toArray());     $students = [];     foreach ($all as $student) {             $students[] =$student;     }       return response()->json($students)->getContent();     } isso

      Em studentRelation temos na tabela StudentDisciplineClassroom com os campos

      id(chave primaria)
      ra (chave estrangera que referencia o campo academic_registration na tabela de students)

      e a tabela student tem os campos

      id (chave primária)
      academic_registration (que vai ser refeenciada na tabela StudentDisciplineClassroom

      Mas na hora de fazer
      $sdc::select('student')->with('studentRelation')->where('classroom',$request->classroom)->distinct('student')->get();
      O studentRelation retorna nulo

      Onde eu posso estar errando?
    • Por joao b silva
      Tenho uma pequena aplicação em php que gera arquivos pdf com a MPDF e envia email com a PHPMAILER. De repente a app parou de enviar os emails  e apresenta a seguinte mensagem de erro:
       
      Error PHPMailer: SMTP Error: Could not authenticate.
       
      Faço uso de um hotmail para a configuração do PHPMAILER.
    • 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
×

Informação importante

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