Ir para conteúdo

POWERED BY:

Arquivado

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

KUROL3

Inner Join

Recommended Posts

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

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

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

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

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

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

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

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

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

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

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

×

Informação importante

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