KUROL3 3 Denunciar post Postado Abril 17, 2009 Propleminha ou Problemão...? estou com tentando uma solução que não vi resultado ainda.. tenho duas tabelas #tabela 1 dados_processuais #tabela 2 andamentos /* cada andamento tem o id dos dados processuais eu quero que o select pegue apenas o ultimo andamento (lembrando que cada processo pode ter varios andamentos) postado vinculado com os dados processuais e liste. Abraço. Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Abril 19, 2009 SELECT a.campos, dp.campos FROM andamentos AS a INNER JIN dados_processuais AS dp ON dp.id = a.id_dp ORDER BY a.id DESC LIMIT 1 Tente isso, alterando os nomes dos campos, claro Compartilhar este post Link para o post Compartilhar em outros sites
KUROL3 3 Denunciar post Postado Abril 24, 2009 Olá Beraldo muito obrigado pela resposta, mas eu nem tentei pq nao vai dar o que eu quero... vamos partir do seu select... a idéia é essa só que, quero todos os dados processuais listados com "o ultimo andamento". vou dar um exemplo do que quero.. (EU SEI QUE ESSE SELECT NAO FUNCIONA) somente para mostrar a idéia ok SELECT a.campos, dp.campos FROM andamentos AS a INNER JIN dados_processuais AS dp ON (dp.id = a.id_dp ORDER BY id DESC LIMIT 1) ORDER BY a.campos Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Abril 24, 2009 Pergunta: como você identifica qual é o último andamento? É um campo numérico ou de data que usa? Se for, você pode usar o max neste campo e um group by pelo id para selecionar... algo como o select abaixo: SELECT a.campos, dp.campos, max(dp.data) FROM andamentos AS a INNER JOIN dados_processuais AS dp ON (dp.id = a.id_dp ORDER BY id DESC LIMIT 1) GROUP BY a.campos, dp.campos ORDER BY a.campos []'s Compartilhar este post Link para o post Compartilhar em outros sites
KUROL3 3 Denunciar post Postado Abril 24, 2009 Chrnos o que está em laranja nao funciona em inner join (era so um exemplo para pegar a iédia..) SELECT a.campos, dp.campos, max(dp.data) FROM andamentos AS a INNER JOIN dados_processuais AS dp ON (dp.id = a.id_dp ORDER BY id DESC LIMIT 1) GROUP BY a.campos, dp.campos ORDER BY a.campos Marco Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Abril 24, 2009 Foi mal, eu copiei sem ver este order by... mas o max tem como função pegar o maior valor do campo passado por parâmetro, de modo que se usar um campo código autoincremental como chave da tabela ou data, ele deve funcionar. Usei ele algumas vezes para pegar o último contato de acordo com uma tabela com N contatos para um mesmo cliente e nunca tive problemas com ele. Select corrigido: SELECT a.campos, dp.campos, max(dp.data) FROM andamentos AS a INNER JOIN dados_processuais AS dp ON (dp.id = a.id_dp) GROUP BY a.campos, dp.campos ORDER BY a.campos Compartilhar este post Link para o post Compartilhar em outros sites
KUROL3 3 Denunciar post Postado Abril 24, 2009 bom meu select acabou ficando assim //tabela andamentos vamos lá (imagina registro no banco) id = 1 - flag_banco = 1 - id_dp = 25 id = 2 - flag_banco = 1 - id_dp = 25 id = 3 - flag_banco = 1 - id_dp = 25 id = 4 - flag_banco = 0 - id_dp = 25 id = 5 - flag_banco = 1 - id_dp = 25 id = 6 - flag_banco = 1 - id_dp = 25 esse registro nao era pra ser encontrado... como estamo usando max(A.id) era para ter pego o A.id=6 que o flag_banco = 1 e nao zero conforme minha condição where... "e pq aparece?" o flag_banco do max(A.id) teria que ser = a zero para poder exibir mas parece que ele pega de qualquer andamento.. SELECT MAX( A.id ) AS maior_id, DATE_FORMAT(A.data_mao, '%d/%m/%Y') as data_mao_OK, A.descricao, A.data_mao, DP.cad, A.id, (SELECT nome FROM clientes C WHERE C.id = DP.requerido) as nome_reu, (SELECT nome FROM clientes C WHERE C.id = DP.requerente) as nome_autor FROM dados_processuais DP INNER JOIN andamentos A ON ( DP.id = A.dados_processuais ) WHERE A.flag_banco = 0 AND (TO_DAYS(NOW()) - TO_DAYS(A.data_mao) >= 45 AND TO_DAYS(NOW()) - TO_DAYS(A.data_mao) <= 90) GROUP BY A.dados_processuais ORDER BY A.data_mao ASC Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Abril 24, 2009 Primeiro, sua select está pegando o max(A.id) que tenha a flag 0, conforme sua restrição do where... então o seu where está dizendo para pegar o max (A.id) que tenha o flag = 0 e esteja dentro do período que você informou (no caso o 4 pelo exemplo que deixou aqui no post). Quanto a select, não sei se o MySql suporta o tipo de inner join que vou sugerir, mas no sqlServer eu não faço uma subselect como você fez para pegar os nomes, faço desta forma: SELECT MAX( A.id ) AS maior_id, DATE_FORMAT(A.data_mao, '%d/%m/%Y') as data_mao_OK, A.descricao, A.data_mao, DP.cad, A.id, REQ.NOME AS NOME_REU, RQT.NOME AS NOME_AUTOR FROM dados_processuais DP INNER JOIN andamentos A ON ( DP.id = A.dados_processuais ) INNER JOIN clientes REQ ON ( REQ.id = DP.requerido ) INNER JOIN clientes RQT ON ( RQT.id = DP.requerente ) WHERE A.flag_banco = 0 AND (TO_DAYS(NOW()) - TO_DAYS(A.data_mao) >= 45 AND TO_DAYS(NOW()) - TO_DAYS(A.data_mao) <= 90) GROUP BY A.dados_processuais ORDER BY A.data_mao ASC Agora... estou na dúvida se este seu group by funciona assim, visto que o campo que usa para agrupar nem aparece na lista de dados selecionados... e sua explanação do problema está meio confusa. []'s Compartilhar este post Link para o post Compartilhar em outros sites
KUROL3 3 Denunciar post Postado Abril 24, 2009 vou tentar explicar de outra forma se o select.. (mas as inner que você colocou nem testei.... porem sei que funciona... e o group do jeito que coloque tb funciona..)... eis ai o problema eu quero mostrar para o usuario no periodo de 45 a 90 dias os processos cujo o ultimo andamento nao foram cadastro.. e se foi cadastrado avisar quando o ultimo andamneto passou 45 dias sem cadastrar.....a condição que define se foi cadastrado ou nao é o flag_banco (0 nao - 1 foi) da tabela andamentos. outra opcao que pode ajudar é: como eu agrupo e pego o ultimo registro de cada agrupamento. ex: o max(id) retorna o ultimo registro do andamento mas não a ultima linha... aguardo marco Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Abril 24, 2009 Depende de como você monta seu select... como não posso testar nas suas tabelas, tente assim: SELECT maior_id, data_mao_OK, descricao, data_mao, DP.cad, REQ.NOME AS NOME_REU, RQT.NOME AS NOME_AUTOR FROM dados_processuais DP INNER JOIN (SELECT MAX( A.id ) AS maior_id, DATE_FORMAT(A.data_mao, '%d/%m/%Y') as data_mao_OK, A.descricao, A.data_mao FROM andamentos A WHERE A.flag_banco = 0 AND (TO_DAYS(NOW()) - TO_DAYS(A.data_mao) >= 45 AND TO_DAYS(NOW()) - TO_DAYS(A.data_mao) <= 90) GROUP BY DATE_FORMAT(A.data_mao, '%d/%m/%Y'), A.descricao, A.data_mao ) AUX ON ( DP.id = AUX.maior_id) INNER JOIN clientes REQ ON ( REQ.id = DP.requerido ) INNER JOIN clientes RQT ON ( RQT.id = DP.requerente ) ORDER BY data_mao ASC Usei uma sintaxe parecida a que uso em algumas rotinas que monto no SQLServer. Ps.: não entendi uma coisa... se o que vale é o id, porque usava o join assim? INNER JOIN andamentos A ON ( DP.id = A.dados_processuais ) []'s Compartilhar este post Link para o post Compartilhar em outros sites
KUROL3 3 Denunciar post Postado Abril 24, 2009 vou um segundo vou disponibilizar um banco... para você testar.. com alguns dados... banco: mysql01.carregando.com.br usuario: carrega_imaster senha: senhadeteste execute esse select vai reparar que o maior_id = 4 sendo que o maior na verdade é o 6 dos dados processuais 1 entao eu teria que pegar o ultimo id tipo nesse caso o 6 e verificar se o flag_banco = 0 caso seja = a 0 ai mostra para o cliente caso contrario não mostra... SELECT MAX( A.id ) AS maior_id, DATE_FORMAT(A.data_mao, '%d/%m/%Y') as data_mao_OK, A.descricao, A.data_mao, DP.cad, A.id, (SELECT nome FROM clientes C WHERE C.id = DP.requerido) as nome_reu, (SELECT nome FROM clientes C WHERE C.id = DP.requerente) as nome_autor FROM dados_processuais DP INNER JOIN andamentos A ON ( DP.id = A.dados_processuais ) WHERE A.flag_banco = 0 AND (TO_DAYS(NOW()) - TO_DAYS(A.data_mao) >= 45 AND TO_DAYS(NOW()) - TO_DAYS(A.data_mao) <= 90) GROUP BY A.dados_processuais ORDER BY A.data_mao ASC abraco Marco Compartilhar este post Link para o post Compartilhar em outros sites
giesta 29 Denunciar post Postado Abril 25, 2009 infelizmente,,, giesta@oceanic:~$ mysql -h mysql01.carregando.com.br -u carrega_imaster -psenhadeteste ERROR 1045 (28000): Access denied for user 'carrega_imaster'@'oceanic' (using password: YES) giesta@oceanic:~$ porem... giesta@oceanic:~$ ping mysql01.carregando.com.br PING mysql01.carregando.com.br (200.234.202.114) 56(84) bytes of data. 64 bytes from hm1314.locaweb.com.br (200.234.202.114): icmp_seq=1 ttl=56 time=208 ms 64 bytes from hm1314.locaweb.com.br (200.234.202.114): icmp_seq=2 ttl=56 time=213 ms 64 bytes from hm1314.locaweb.com.br (200.234.202.114): icmp_seq=3 ttl=56 time=78.3 ms 64 bytes from hm1314.locaweb.com.br (200.234.202.114): icmp_seq=4 ttl=56 time=237 ms 64 bytes from hm1314.locaweb.com.br (200.234.202.114): icmp_seq=5 ttl=56 time=608 ms mas no caso sua consulta pode ser resolvida sem mta confusao com MAX() em vez de order by Compartilhar este post Link para o post Compartilhar em outros sites