Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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,
~RonaldoOii, 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);
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***#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%'
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 = "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.