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
      Tudo bem pessoal?
       
      No código abaixo, estou fazendo uma consulta nas tabelas, banners e banners_referencia
      Meu objetivo é trazer resultados com valores iguais ao nome da cidade declarada na $cidade ou resultados com a referencia Total.
      O problema é que está trazendo todos os resultados. Tenho 10 linhas, 1 com o nome da cidade e duas com o valor Total, então o resultado teria que ser de apenas 3 linhas, mas mostra tudo.
       
      $banner = "SELECT A.*, B.* FROM banners A, banners_referencia B WHERE B.cod_referencia = A.cod_referencia AND A.cidade = '$cidade' OR B.referencia = 'Total' ORDER BY RAND()";
      $banner = mysqli_query($conexao, $banner) or die ("Banner não encontrado");
      while($busca= mysqli_fetch_array($banner)){
          print $busca['cidade'].'<br>';
      };
       
      Alguém consegue me ajudar?
    • Por Rafael_Ferreira
      Não consigo carregar a imagem do captcha do meu formulário. Foi testado com o xampp e easyphp. Também não carregou a imagem de outros captcha. 
       
       
    • Por luiz monteiro
      Olá, tudo bem?
       
      Estou melhorando meu conhecimento em php e mysql e, me deparei com o seguinte. A tabela da base de dados tem um campo do tipo varchar(8) o qual armazena números. Eu não posso alterar o tipo desse campo. O que preciso é fazer um select para retornar o números que contenham zeros a direita ou a esquerda.
      O que tentei até agora
       
      Ex1
      $busca = $conexao->prepare("select campo form tabela where (campo = :campo) ");
      $busca->bindParam('campo', $_REQUEST['campo_form']);
       
      Se a direita da string $_REQUEST['campo_form'] termina ou inicia com zero ou zeros, a busca retorna vazio.
      Inseri dados numéricos, da seguinte maneira para testar: 01234567;  12345670: 12345678: 12340000... entre outros nessa coluna. Todos os valores que não terminam ou não iniciam com zero ou zeros, o select funciona.
       
       
      Ex2
      $busca = $conexao->prepare("select campo form tabela where (campo = 0340000) ");
      Esse número está cadastrado, mas não retorna.
       
      Ex3
      $busca = $conexao->prepare("select campo form tabela where (campo = '02340001' ) ");
      Esse número está cadastrado, mas não retorna.
       
       
      Ex4
      $busca = $conexao->prepare("select campo form tabela where (campo like 2340000) ");
      Esse número está cadastrado, mas não retorna.
       
      Ex5
      $busca = $conexao->prepare("select campo form tabela where (campo like '12340000') ");
      Esse número está cadastrado, mas não retorna.
       
      Ex6
      $busca = $conexao->prepare("select campo form tabela where (campo like '"12340000"' ) ");
      Esse número está cadastrado, mas não retorna.
       
       
      Ex7
      $busca = $conexao->prepare("select campo form tabela where (campo like :campo) ");
      $busca->bindParam('campo', $_REQUEST['campo_form'])
      Não retorna dados.
       
      O  $_REQUEST['campo_form'] é envio via AJAX de um formulário. 
      Usei o gettype para verificar o post, e ele retorna string.
      Fiz uma busca com número 12345678 para verificar o que o select retorna, e também retrona como string.
       
      Esse tipo de varchar foi usado porque os números que serão gravados nesse campo,  terão zeros a direita ou na esquerda. Os tipos number do mysql não gravam zeros, então estou usando esse. O problema é a busca.
      Agradeço desde já.
       
       
    • Por daemon
      Boa tarde,
       
      Eu tenho uma rotina que faz uma leitura do arquivo .xml de vários sites.

      Eu consigo pegar o tópico e a descrição, e mostrar a imagem que esta na pagina do link.
      Para isso utilizo esta função:
      function getPreviewImage($url) { // Obter o conteúdo da página $html = file_get_contents($url); // Criar um novo objeto DOMDocument $doc = new DOMDocument(); @$doc->loadHTML($html); // Procurar pela tag meta og:image $tags = $doc->getElementsByTagName('meta'); foreach ($tags as $tag) { if ($tag->getAttribute('property') == 'og:image') { return $tag->getAttribute('content'); } } // Se não encontrar og:image, procurar pela primeira imagem na página $tags = $doc->getElementsByTagName('img'); if ($tags->length > 0) { return $tags->item(0)->getAttribute('src'); } // Se não encontrar nenhuma imagem, retornar null return null; } // Uso: $url = "https://example.com/article"; $imageUrl = getPreviewImage($url); if ($imageUrl) { echo "<img src='$imageUrl' alt='Preview'>"; } else { echo "Nenhuma imagem encontrada"; }  
      Mas estou com um problema, esta funcão funciona quando coloco em uma pagina de teste.php. Preciso mostrar em uma página inicial diversas fotos de todos os links. (No caso acima só funciona 1).
×

Informação importante

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