J'ai un users
tableau et un payments
tableau, pour chaque utilisateur, ceux dont ont des paiements, peuvent avoir plusieurs paiements associés dans le payments
tableau. Je souhaite sélectionner tous les utilisateurs qui ont effectué des paiements, mais uniquement leur dernier paiement. J'essaye ce SQL mais je n'ai jamais essayé les instructions SQL imbriquées avant donc je veux savoir ce que je fais mal. Appréciez l'aide
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
la source
la source
Part 1 - Joins and Unions
. :) mis en signet!Cette solution est meilleure que la réponse acceptée car elle fonctionne correctement lorsqu'il y a des paiements avec le même utilisateur et la même date.
la source
Découvrez ce sqlfiddle
la source
limit 1
clause ne renverra qu'un utilisateur, ce qui n'est pas ce que souhaite l'OP.date
colonne est différente demax(p.date)
. Si vous ajoutez plus de colonnes dans lepayments
tableau (par exemplecost
), toutes ces colonnes ne seront pas de la ligne nécessairela source
Il y a deux problèmes avec votre requête:
INNER JOIN (SELECT ...) AS p ON ...
.En supposant qu'il n'y a pas de liens pour
payments.date
, essayez:la source
From payments as p Where p.user_id =@user_id
car la requête effectue un groupe sur la table entière.La réponse de @John Woo m'a aidé à résoudre un problème similaire. J'ai également amélioré sa réponse en définissant le bon ordre. Cela a fonctionné pour moi:
Cependant, je ne suis pas sûr de son efficacité.
la source
Cela le fera fonctionner
la source
Matei Mihai a donné une solution simple et efficace mais cela ne fonctionnera pas tant que vous n'aurez pas mis une
MAX(date)
partie SELECT, donc cette requête deviendra:Et commander par ne fera aucune différence dans le groupement mais il peut ordonner le résultat final fourni par group by. Je l'ai essayé et cela a fonctionné pour moi.
la source
Ma réponse directement inspirée de @valex très utile, si vous avez besoin de plusieurs cols dans la clause ORDER BY.
la source
Vous pouvez essayer ceci:
la source