Mam users
tabelę i payments
tabelę, dla każdego użytkownika, z którym mają płatności, mogą mieć wiele powiązanych płatności w payments
tabeli. Chciałbym wybrać wszystkich użytkowników, którzy mają płatności, ale wybrać tylko ostatnią płatność. Próbuję tego SQL, ale nigdy wcześniej nie próbowałem zagnieżdżonych instrukcji SQL, więc chcę wiedzieć, co robię źle. Doceń pomoc
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
źródło
źródło
Part 1 - Joins and Unions
. :) dodany do zakładek!To rozwiązanie jest lepsze niż zaakceptowana odpowiedź, ponieważ działa poprawnie, gdy są płatności z tym samym użytkownikiem i datą.
źródło
Sprawdź to sqlfiddle
źródło
limit 1
Klauzula będzie tylko powrót 1 użytkownika, który nie jest co PO chce.date
kolumna różni się odmax(p.date)
. Jeśli dodasz więcej kolumn wpayments
tabeli (np.cost
), Wszystkie te kolumny nie będą z wymaganego wierszaźródło
Z Twoim zapytaniem wiążą się dwa problemy:
INNER JOIN (SELECT ...) AS p ON ...
.Zakładając, że nie ma żadnych powiązań
payments.date
, spróbuj:źródło
From payments as p Where p.user_id =@user_id
gdy zapytanie wykonuje grupę według całej tabeli.Odpowiedź @John Woo pomogła mi rozwiązać podobny problem. Poprawiłem jego odpowiedź, ustawiając również prawidłową kolejność. To zadziałało dla mnie:
Nie jestem jednak pewien, jak wydajne jest to.
źródło
To sprawi, że będzie działać
źródło
Matei Mihai otrzymał proste i wydajne rozwiązanie, ale nie zadziała, dopóki nie
MAX(date)
wstawi części SELECT, więc to zapytanie stanie się:Kolejność według nie ma żadnego wpływu na grupowanie, ale może uporządkować wynik końcowy dostarczony przez grupę według. Spróbowałem i zadziałało.
źródło
Moja odpowiedź bezpośrednio zainspirowana @valex jest bardzo przydatna, jeśli potrzebujesz kilku kolumn w klauzuli ORDER BY.
źródło
Możesz spróbować tego:
źródło