Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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!!!!
Qual banco? Mysql?
Carlos Eduardo
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.
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
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.
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
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.
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>
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.
Como não, hehe
posta ai o codigo... as vezes é uma "virgula no lugar de um ponto"
como eu depois de uns 20min tentando
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 =/
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.
>
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.
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.select max(id) id, cpf, nome group by cpf, nome
>
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...
>
>
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
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!! :)
Use distinct.