Ich habe eine users
Tabelle und eine payments
Tabelle, für jeden Benutzer, für den Zahlungen vorliegen, können mehrere Zahlungen in der payments
Tabelle enthalten sein. Ich möchte alle Benutzer auswählen, die Zahlungen haben, aber nur ihre letzte Zahlung auswählen. Ich versuche dieses SQL, aber ich habe noch nie zuvor verschachtelte SQL-Anweisungen ausprobiert, daher möchte ich wissen, was ich falsch mache. Schätzen Sie die Hilfe
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
quelle
quelle
Part 1 - Joins and Unions
. :) Lesezeichen!Diese Lösung ist besser als die akzeptierte Antwort, da sie bei einigen Zahlungen mit demselben Benutzer und Datum ordnungsgemäß funktioniert.
quelle
Schauen Sie sich diese SQLfiddle an
quelle
limit 1
Klausel gibt nur 1 Benutzer zurück, was nicht das OP will.date
Spalte unterscheidet sich vonmax(p.date)
. Wenn Sie weitere Spalten in diepayments
Tabellecost
quelle
Es gibt zwei Probleme mit Ihrer Abfrage:
INNER JOIN (SELECT ...) AS p ON ...
.Angenommen, es gibt keine Bindungen für
payments.date
: Versuchen Sie:quelle
From payments as p Where p.user_id =@user_id
wenn die Abfrage eine Gruppe nach der gesamten Tabelle ausführt .Die Antwort von @John Woo hat mir geholfen, ein ähnliches Problem zu lösen. Ich habe seine Antwort verbessert, indem ich auch die richtige Reihenfolge eingestellt habe. Das hat bei mir funktioniert:
Ich bin mir jedoch nicht sicher, wie effizient dies ist.
quelle
Dies wird es zum Laufen bringen
quelle
Matei Mihai hat eine einfache und effiziente Lösung gegeben, die jedoch erst funktioniert, wenn ein
MAX(date)
Teil in SELECT eingefügt wird, sodass diese Abfrage wie folgt lautet:Die Reihenfolge nach macht keinen Unterschied bei der Gruppierung, kann jedoch das Endergebnis nach Gruppe nach bestellen. Ich habe es versucht und es hat bei mir funktioniert.
quelle
Meine Antwort ist direkt von @valex inspiriert und sehr nützlich, wenn Sie mehrere Spalten in der ORDER BY-Klausel benötigen.
quelle
Sie können dies versuchen:
quelle