Eu tenho uma users
mesa e uma payments
mesa, para cada usuário, aqueles que possuem pagamentos, podem ter vários pagamentos associados na payments
mesa. Gostaria de selecionar todos os usuários que têm pagamentos, mas selecionar apenas o último pagamento. Estou tentando este SQL, mas nunca tentei instruções SQL aninhadas antes, então quero saber o que estou fazendo de errado. Agradeço a ajuda
SELECT u.*
FROM users AS u
INNER JOIN (
SELECT p.*
FROM payments AS p
ORDER BY date DESC
LIMIT 1
)
ON p.user_id = u.id
WHERE u.package = 1
mysql
sql
select
inner-join
Wasim
fonte
fonte
Part 1 - Joins and Unions
. :) marcado como favorito!Esta solução é melhor do que a resposta aceita porque funciona corretamente quando há alguns pagamentos com o mesmo usuário e data.
fonte
Confira este sqlfiddle
fonte
limit 1
cláusula retornará apenas 1 usuário, o que não é o que o OP deseja.date
coluna é diferente demax(p.date)
. Se você adicionar mais colunas napayments
tabela (por exemplocost
), todas as colunas não serão da linha necessáriafonte
Existem dois problemas com a sua consulta:
INNER JOIN (SELECT ...) AS p ON ...
.Supondo que não haja empates para
payments.date
, tente:fonte
From payments as p Where p.user_id =@user_id
quando a consulta estiver agrupando por em toda a tabela.A resposta de @John Woo me ajudou a resolver um problema semelhante. Eu melhorei sua resposta definindo a ordem correta também. Isso tem funcionado para mim:
Não tenho certeza de quão eficiente isso é, no entanto.
fonte
Isso fará com que funcione
fonte
Matei Mihai forneceu uma solução simples e eficiente, mas não funcionará até que seja colocado um
MAX(date)
na parte SELECT, então esta consulta se tornará:E ordenar por não fará nenhuma diferença no agrupamento, mas pode ordenar o resultado final fornecido por grupo por. Eu tentei e funcionou para mim.
fonte
Minha resposta foi inspirada diretamente em @valex, muito útil, se você precisar de várias colunas na cláusula ORDER BY.
fonte
Você pode tentar isto:
fonte