Ir ao conteúdo

Select e INNER JOIN (MYSQL)


eric123

Posts recomendados

Postado

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

Postado

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

  • Moderador
Postado

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

Postado

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)

:)

  • Moderador
Postado

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.

Postado

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.

Postado


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

Postado

@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

Arquivado

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

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!