Ir para conteúdo

POWERED BY:

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 ILR master
      Fala galera, tudo certo?
       
      Seguinte: No servidor A estou tentando fazer uma consulta com o servidor B, mas está dando erro.
      Estou usando o mesmo código de conexão do servidor B que funciona perfeitamente, mas no servidor A, dá erro.
      Segue código:
       
      $host = 'servidor B';
      $user = 'user';
      $pass = '********';
      $db   = 'banco';
       
      // conexão e seleção do banco de dados
      $conexao = mysqlI_connect($host, $user, $pass, $db);
      mysqlI_set_charset($conexao,"utf8");
      //print "Conexão rodando e OK!"; 
      //mysqlI_close($conexao);
       
      Alguém pode me ajudar?
    • Por violin101
      Caros amigos, saudações.
       
      Por favor, poderiam me ajudar.

      Estou com a seguinte dúvida:
      --> como faço para para implementar o input código do produto, para quando o usuário digitar o ID o sistema espera de 1s a 2s, sem ter que pressionar a tecla ENTER.

      exemplo:
      código   ----   descrição
           1       -----   produto_A
       
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Humildemente peço desculpa por postar uma dúvida que tenho.

      Preciso salvar no MySql, os seguinte Registro:

      1 - Principal
      ====> minha dúvida começa aqui
      ==========> como faço para o Sistema Contar Automaticamente o que estiver despois do 1.____?
      1.01 - Matriz
      1.01.0001 - Estoque
      1.01.0002 - Oficina
      etc

      2 - Secundário
      2.01 - Loja_1
      2.01.0001 - Caixa
      2.01.0002 - Recepção
      etc
       
      Resumindo seria como se fosse um Cadastro de PLANO de CONTAS CONTÁBEIL.

      Grato,


      Cesar









       
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer a orientação dos amigos.

      Preciso fazer um Relatório onde o usuário pode Gerar uma Lista com prazo para vencimento de: 15 / 20/ 30 dias da data atual.

      Tem como montar uma SQL para o sistema fazer uma busca no MySql por período ou dias próximo ao vencimento ?

      Tentei fazer assim, mas o SQL me traz tudo:
      $query = "SELECT faturamento.*, DATE_ADD(faturamento.dataVencimento, INTERVAL 30 DAY), fornecedor.* FROM faturamento INNER JOIN fornecedor ON fornecedor.idfornecedor = faturamento.id_fornecedor WHERE faturamento.statusFatur = 1 ORDER BY faturamento.idFaturamento $ordenar ";  
      Grato,
       
      Cesar
       
       
       
       
    • Por violin101
      Caros amigos, saudações
       
      Por favor, me perdoa em recorrer a orientação dos amigos, tenho uma dúvida.
       
      Gostaria de uma rotina onde o Sistema possa acusar para o usuário antes dos 30 dias, grifar na Tabela o aviso de vencimento próximo, por exemplo:
       
      Data Atual: 15/11/2024
                                           Vencimento
      Fornecedor.....................Data.....................Valor
      Fornecedor_1...........01/12/2024..........R$ 120,00 <== grifar a linha de Laranja
      Fornecedor_1...........01/01/2025..........R$ 130,00
      Fornecedor_2...........15/12/2024..........R$ 200,00 <== grifar a linha de Amarelo
      Fornecedor_2...........15/01/2025..........R$ 230,00
      Fornecedor_3...........20/12/2024..........R$ 150,00
       
      Alguém tem alguma dica ou leitura sobre este assunto ?

      Grato,
       
      Cesar
×

Informação importante

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