Ir para conteúdo

POWERED BY:

Arquivado

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

Zinhani

Group e Order

Recommended Posts

Olá pessoal,

 

Pesquisei assuntos parecidos mas nenhum encaixou no que eu estou querendo, ou os apresentados no forum não gerou o resultado correto.

 

Bom, tenho um form de inscrições que a pessoa pode se inscrever quantas vezes ela quiser, porem só será válido o seu último registro.

 

Como a ideia e pegar só o ultimo registro eu nao estou conseguindo a sintaxe apropriada para fazer essa consulta no sql.

 

Vejamos o exemplo,

 

ID - CPF - NOME

 

01 - 222 - André

02 - 222 - André

03 - 999 - Marcos

 

Consulta: (resultado esperado)

 

02 - 222 - André

03 - 999 - Marcos

 

Eu tentei fazer assim: group by cpf order by id DESC

 

entretanto, o resultado sempre sai assim:

 

01 - 222 - André

03 - 999 - Marcos

 

Mesmo alternando entre DESC e ASC ele só inverte a ordem:

 

03 - 999 - Marcos

01 - 222 - André

 

 

Será que alguem sabe como eu poderia fazer isso???

 

Agradeceria muito!!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

MySQL: 5.0.32

PHP Última versão

 

Eu já tinha tentado usar o distinct, porem tive algumas duvidas e nao achei a solução.

Ex:

O unico campo da tabela q nao pode se repetir é o cpf. entretanto existem outros campos que terá registros repetidos. Sendo assim (SELECT DISTINCT cpf) não basta, pq eu tbm quero exibir as outras informações e eu nao soube como usar os campos sem que eles entrem no distinct.

 

tem solução?

 

Conversando com alguns amigos eles me recomendaram o uso do group, mas até agora nao descobri como exibir os ultimos registros.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, já que é Mysql, vou mover para o fórum correto. Lá o pessoal vai poder ajudar melhor.

 

Carlos Eduardo

 

Tópico Movido

PHP http://forum.imasters.com.br/public/style_emoticons/default/seta.gif Mysql

Compartilhar este post


Link para o post
Compartilhar em outros sites

Zinhani, boa noite!

 

Então eu não manojo muito mas vou tentar de ajudar, vamos lá:

 

Criei uma database

create database teste 14092009

Criei uma tabela

create table inscricoes (
	ID int NOT NULL identity primary key,
	CPF varchar(20) null,
	Nome varchar(60) null,	
	)

Inseri na seguencia os dados

values (34445444444, 'julio');
insert into inscricoes (cpf, nome)
insert into inscricoes (cpf, nome)
values (34445444413, 'rafael');
insert into inscricoes (cpf, nome)
values (34445444424, 'matheus');
insert into inscricoes (cpf, nome)
values (34445444445, 'sebastião');
insert into inscricoes (cpf, nome)
values (34445444453, 'rodrigo');
insert into inscricoes (cpf, nome)
values (34445444463, 'juam');
insert into inscricoes (cpf, nome)
values (34445444443, 'rafael');
insert into inscricoes (cpf, nome)
values (34445444444, 'julio');
insert into inscricoes (cpf, nome)
values (34445444443, 'rafael');
insert into inscricoes (cpf, nome)
values (344454388843, 'gabriel');

Até aqui temos dez resultados, onde o rafael é o 2, 7 e 9, no que vocês esta querendo é pegar o ultimo registro da mesma pessoa, então fiz isso:

SELECT a.nome,a.id
from inscricoes a, inscricoes b
where a.cpf = b.cpf and a.id > b.id
Order by a.ID desc

Aqui o Resultado seu assim:

 

Rafael 9

Julio 8

 

tente entender o código, mas também não sei se esta correto, mas vamos aprender juntos, qualquer dúvida posta ae.

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gs3llmann, fico feliz em ver pessoas assim como você que faz um sacrifício sem nada em troca...

Muito Obrigado mesmo!!!

 

Não testei ainda, mas tenho certeza que vai resolver o problema...

E pode ter certeza que vou procurar estudar mais essa logica de colocar as varaveis na sintaxe.

 

Abraços

 

================ UP =====================

 

testei...

 

funcionou, porem um entretanto.

 

ele só exibe os ultimos registros que estao duplicados.

estaria otimo, mas ainda é necessario tbm exibir os registro unicos.

 

no seu exemplo seria mais ou menos assim o resultado

 

 

3 matheus

4 sebastião

5 rodrigo

6 juam

8 julio

9 rafael

10 gabriel

 

 

Vou tentar, fazer mais algumas modificações, mas se algum puder continuar ajudando esta valendo...

 

obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Zinhani, OBRIGADO!!!

 

http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

 

 

Não tinha entendido a pergunta do seu tópico, quando você disse que só a pessoa pode se cadastrar várias vezes mas só seria válido o ultimo poste, nem lembrei de quem se cadastra só uma vez, enfim, tentei mas não consegui, vou continuar do emprego amanhã, abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acontece que para isso, antes de agrupar será necessário ordenar. Então criando uma inline view e agrupando irá funcionar.

 

Exemplo:

 

SELECT X.ID, X.CPF, X.NOME
  FROM (
    SELECT ID, CPF, NOME
      FROM TABELA
      ORDER BY ID DESC
  ) X
  GROUP BY X.CPF

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acontece que para isso, antes de agrupar será necessário ordenar. Então criando uma inline view e agrupando irá funcionar.

 

Exemplo:

 

SELECT X.ID, X.CPF, X.NOME
  FROM (
    SELECT ID, CPF, NOME
      FROM TABELA
      ORDER BY ID DESC
  ) X
  GROUP BY X.CPF

 

To vendo que tenho muito a estudar...

 

Eclesiastes, muito obrigado.

fiz os testes e funcionou perfeitamente.

 

só acrescentei um order depois do group pra ele ordenar pela id, pois ele estava ordenando pelo cpf.

 

SELECT X.ID, X.CPF, X.NOME
  FROM (
    SELECT ID, CPF, NOME
      FROM TABELA
      ORDER BY ID DESC
  ) X
  GROUP BY X.CPF
  ORDER BY X.ID DESC

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então me ajudem compreender !

 

SELECT x.ID, x.CPF, x.Nome
FROM (
SELECT ID, CPF, Nome
FROM inscricoes
ORDER BY ID DESC  
) x  
GROUP BY x.CPF  
ORDER BY x.ID DESC

Erro que apresenta

Msg 1033, Level 15, State 1, Line 6
A cláusula ORDER BY é inválida em modos de exibição, funções embutidas, tabelas derivadas, subconsultas e expressões de tabela comuns, a menos que TOP ou FOR XMXL também estejam especificados.

Não entendi porque vocês conseguiram =/

Compartilhar este post


Link para o post
Compartilhar em outros sites

SELECT x.*

FROM (SELECT *

FROM inscritos

WHERE tipo='1'

ORDER BY id DESC

) x

GROUP BY x.cpf

ORDER BY x.id ASC

 

aqui esta funcionando assim

e ainda coloquei o WHERE tipo='1' no meio.

 

esse erro eu nao sei explicar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então me ajudem compreender !

 

SELECT x.ID, x.CPF, x.Nome
FROM (
SELECT ID, CPF, Nome
FROM inscricoes
ORDER BY ID DESC  
) x  
GROUP BY x.CPF  
ORDER BY x.ID DESC

Erro que apresenta

Msg 1033, Level 15, State 1, Line 6
A cláusula ORDER BY é inválida em modos de exibição, funções embutidas, tabelas derivadas, subconsultas e expressões de tabela comuns, a menos que TOP ou FOR XMXL também estejam especificados.

Não entendi porque vocês conseguiram =/

 

Olá, pelo que parece você tentou executar esta query no SQL Server, não no MySQL. Correto? Então é aceitável esperar tal resultado. ;) A mensagem de erro diz tudo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.

Sei que o tópico é antigo, mas não pude deixar de entrar para demonstrar minha enorme gratidão. Fiquei horas seguidas pesquisando sobre o assunto, fiz queries imensas e complexas, fui em foruns gringos e até no manual do próprio MySQL, e somente aqui encontrei a resposta.

Minha query ficou assim:

 

SELECT
		`m`.`titulo` as `titulo`,
		`m`.`mensagem` as `mensagem`,
		`m`.`data` as `data`,
		`u`.`usuarios_nivel` as `nivel`,
		`u`.`usuarios_nome` as `nome`,
		`u`.`usuarios_email` as `email`
	FROM (SELECT `m`.`topico`,`titulo`,`m`.`mensagem`,`m`.`data`,`m`.`usuario` FROM `mensagens` as `m` ORDER BY data DESC) `m`
	INNER JOIN `usuarios` as `u` ON
		`u`.`usuarios_id` = `m`.`usuario`
	WHERE
		`m`.`usuario` = '.SESSIONID.'
	GROUP BY `m`.`topico`
	ORDER BY `m`.`data` DESC

Agradeço novamente, e desculpe desenterrar o tópico.

Compartilhar este post


Link para o post
Compartilhar em outros sites

select max(id) id, cpf, nome group by cpf, nome 

No meu caso uso um left join, e fazendo como o giesta o valor que retornava de horimetro era o primeiro na tabela.

Eu acabava ficando com a Max(data) no row, mas com um valor de horimetro de outra ocorrência.

Fazendo assim funcionou,

 

 

SELECT MAX( x.data ) , x.placa, x.horimetro km
                FROM (
                    SELECT c.data, f.placa, c.horimetro
                    FROM freteveiculos f
                    LEFT JOIN combustivel c ON f.placa = c.equipamento
                    ORDER BY data DESC
                )x
                GROUP BY x.placa
                ORDER BY x.placa
Pra entender o exemplo

Tenho varios abastecimentos de "placas" de veiculos e registro a quilometragem. Em datas diferentes.

Uso a última quilometragem no banco pra prevenir erros na próxima vez que for necessário preencher

 

Minha contribuição pro tópico...

Compartilhar este post


Link para o post
Compartilhar em outros sites

select max(id) id, cpf, nome group by cpf, nome 

 

No meu caso uso um left join, e fazendo como o giesta o valor que retornava de horimetro era o primeiro na tabela.

Eu acabava ficando com a Max(data) no row, mas com um valor de horimetro de outra ocorrência.

Fazendo assim funcionou,

 

 

SELECT MAX( x.data ) , x.placa, x.horimetro km
               FROM (
                   SELECT c.data, f.placa, c.horimetro
                   FROM freteveiculos f
                   LEFT JOIN combustivel c ON f.placa = c.equipamento
                   ORDER BY data DESC
               )x
               GROUP BY x.placa
               ORDER BY x.placa

Pra entender o exemplo

Tenho varios abastecimentos de "placas" de veiculos e registro a quilometragem. Em datas diferentes.

Uso a última quilometragem no banco pra prevenir erros na próxima vez que for necessário preencher

 

Minha contribuição pro tópico...

 

Olá, estava acompnhando este tópico para tirar uma dúvida. Talvez vocês possam me ajudar. Preciso de uma consulta parecida com esta só que dentro de uma VIEW. Estou usando o MySQL. Quando tento criar a view com esta consulta dá o seguinte erro:

1349

View's SELECT contains a subquery in the FROM clause

Compartilhar este post


Link para o post
Compartilhar em outros sites

Falae Pessoal!

 

Não tenho experiência nenhuma em PHP, mas achei esse tópico que QUASE resolveu meu problema. A questão é que ainda não sei como aplicá-lo.

 

É um sistema que controla os pagamentos de vários clientes. Cada cliente pode ter desde um até doze pagamentos, mas nesta tela sempre vai exibir o pagamento em aberto mais recente.

 

O problema é o mesmo, preciso dar um ORDER BY antes do GROUP BY. Vejam meu código atual:

 

SELECT *, count(p_cod) as total

FROM pagamentos INNER JOIN oportunidades ON p_op_cod = op_cod

INNER JOIN oportunidades_fechadas ON fe_op_cod = op_cod INNER JOIN empresas ON op_em_cod = em_cod

INNER JOIN vendedores ON op_ven_cod = ven_cod INNER JOIN forma_pagamento ON fe_fp_cod = fp_cod

WHERE ven_cod = ".$registro_ven['ven_cod']." AND p_pago = 0 GROUP BY p_op_cod ORDER BY p_data ASC";

 

 

Eu preciso ordenar esse GROUP BY p_op_cod pelo p_data para que sempre exiba o primeiro pagamento de cada um dos clientes.

 

Alguém pode me dar uma luz, por favor? :D

Obrigado!! :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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