Zinhani 0 Denunciar post Postado Setembro 14, 2009 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
André D. Molin 15 Denunciar post Postado Setembro 14, 2009 Use distinct. Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Setembro 14, 2009 Qual banco? Mysql? Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
Zinhani 0 Denunciar post Postado Setembro 15, 2009 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
Matias Rezende 50 Denunciar post Postado Setembro 15, 2009 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
Gs3llmann 0 Denunciar post Postado Setembro 15, 2009 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
Zinhani 0 Denunciar post Postado Setembro 15, 2009 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
Gs3llmann 0 Denunciar post Postado Setembro 15, 2009 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
Eclesiastes 2 Denunciar post Postado Setembro 15, 2009 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
Zinhani 0 Denunciar post Postado Setembro 16, 2009 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
Zinhani 0 Denunciar post Postado Setembro 16, 2009 Como não, hehe posta ai o codigo... as vezes é uma "virgula no lugar de um ponto" como eu depois de uns 20min tentando Compartilhar este post Link para o post Compartilhar em outros sites
Gs3llmann 0 Denunciar post Postado Setembro 18, 2009 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
Zinhani 0 Denunciar post Postado Setembro 20, 2009 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
Eclesiastes 2 Denunciar post Postado Setembro 20, 2009 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
Matheus Tavares 167 Denunciar post Postado Setembro 12, 2010 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
giesta 29 Denunciar post Postado Setembro 12, 2010 select max(id) id, cpf, nome group by cpf, nome Compartilhar este post Link para o post Compartilhar em outros sites
Djonatan Buss 0 Denunciar post Postado Novembro 24, 2010 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.placaPra entender o exemploTenho 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
debysoares 0 Denunciar post Postado Janeiro 28, 2011 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
Kalius 0 Denunciar post Postado Agosto 4, 2011 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