Ir ao conteúdo
  • Cadastre-se
eric123

Select e INNER JOIN (MYSQL)

Recommended Posts

Fala pessoal, tendo problemas em acessar uma linha especifica de uma tabelas adiquirida pelo inner join. Tenho uma tabela com diversos usuarios lincada com uma tabela pagamentos, mas quero selecionar somente os usuarios que na linha do seu ultimo idPag tenha um capo com valor um especificado. Segue uma query e um esboço das tabelas

SELECT * FROM users u INNER JOIN pagamento p ON u.idUs = p.idUs GROUP BY u.nome

2ryggfl.jpg

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigão, erro de digitação, fiz um esboço simplificado, considere uma data valida qualquer!

Estou dizendo que neste caso eu tenho uma tabela de 1 para N, ou seja, pra cada usuário vai ter N pagamentos linkados a ele. Quando eu vou selecionar os usuarios fazendo junção de duas tabelas, estou visando selecionar somente aqueles usuários em que, na line de seu "idPag" maior(o ultimo dele) ele verifique a "dataVenc" desta line com uma data que irei passar(serviria pra qualquer outro campo, mas o importante é eu conseguir pegar esta line).

 

Na imagem que postei, pegue, por exemplo, o "Fulano" e veja os pagamentos dele. Teremos registro de 2 pagamentos dele de idPag "1" e "2", o que quero é saber se na linha de idPag=2 na field dtVenc é igual a "alguma data"

Se true, teoriocamente me a query me retorná este usuario.

Entendeu?? rsrs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tá, e QUAL é o erro?  

O que está retornando?

 

seria algo parecido com isso:

SELECT pagamento.dtVenc FROM pagamento WHERE pagamento.idUS = 1INNER JOIN users ON users.idUs = pagamento.idUSGROUP by pagamento.idUS DESC LIMIT 1

Você pegaria a data do pagamento, do usuário 1, em ordem decrescente limitado em 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, na verdade nao consegui fazer a query pra implementar...

Essa query ai pega somente um usuario em espifico, no meu caso vou poder listar N usuarios, tendo em vista uma condição de ser listado que é dependendo do valor o qual estiver no dtVenc do idPag mais alto dentre as lines de pagamento destes usuários. (a resposta que dei acima ta bem claro)

:)

Compartilhar este post


Link para o post
Compartilhar em outros sites

só retirar a clausula where.. que você lista todos, agrupados pelo id do usuário.

Depois é só comparar a data com alguma outra que você digitar pela linguagem de programação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hm...Éh, pelo visto vou ter q fazer com linguagem de programação mesmo rsrs....

Achei que teria alguma forma de extrair estes usuários somente com query utilizando algum metodo de subquery. Mas tudo bem, vou fazer um filtro utilizando a linguagem de programação mesmo! 

Obrigado pessoal.

Compartilhar este post


Link para o post
Compartilhar em outros sites


SELECT idPag
      ,idUs
      ,maior_venc
FROM(
   SELECT idPag
         ,idUs
         ,MAX(dtVenc) AS maior_venc 
   FROM pagamento
   GROUP BY idUs ORDER BY dtVenc DESC
) AS S1 WHERE maior_venc = @sua_data_informada_em_tela;


 

Olá Eric, veja se este select acima atende o que você quer.

 

Vale lembrar, que isso só dá certo, da forma exata que está, em MySQL, pois só o MySQL (pelo que sei), aceita retornar colunas

usando um group by, sem estas colunas estarem em funções de agrupamento (veja que só o dtVenc está em função de agrupamento, neste caso o MAX())

 

Caso não dê certo poste exemplos de dados, e o exemplo do retorno que deseja ^^

 

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Erciley Junior

Muito Obrigado, consegui.

Bom, na verdade criei esta situação visando simplificar o meu problema, pois minha tabela tem mais coisas e não iria ser conveniente listar todas as fields das duas tabelas, as quais se tratam de "clientes" e "movimentacao". Entretanto, foi bom que consegui resolver o meu problema usando este exemplo bem parecido.

 

Vamos a query...

O que você me sugeriu funcionou, mas tive que fazer mais uma subquery dentro da subquery pagamento para poder dizer que quero o ultimo ultimo ID

Não sei se vai entender agora como está a query kkkk, mas o fato é que consegui resolver o meu problema:

SELECT * FROM(	SELECT idMov, idClienteDisk, statusMov	FROM movimentacao INNER JOIN(SELECT MAX(idMov) AS maxMov FROM movimentacao GROUP BY idClienteDisk ORDER BY idMov DESC) AS max	ON idMov = max.maxMov  GROUP BY idClienteDisk ORDER BY idMov DESC) AS m INNER JOIN clientes cON c.idClienteDisk = m.idClienteDiskWHERE c.idCidade = {$idCidade} AND m.statusMov = 1GROUP BY c.nomeCliente

onde "m.statusMov" é a minha condição principal para o usuario aparecer :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×