У меня есть users
таблица и payments
таблица, для каждого пользователя, у тех из которых есть платежи, может быть несколько связанных платежей в payments
таблице. Я хочу выбрать всех пользователей, у которых есть платежи, но выбрать только их последний платеж. Я пробую этот SQL, но я никогда раньше не пробовал вложенные операторы SQL, поэтому хочу знать, что я делаю неправильно. Цените помощь
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
Васим
источник
источник
Part 1 - Joins and Unions
. :) в закладки!Или
Эти решения лучше, чем принятый ответ, потому что они работают правильно, когда есть несколько платежей с одним и тем же пользователем и датой. Вы можете попробовать SQL Fiddle .
источник
Проверьте этот sqlfiddle
источник
limit 1
вернет только 1 пользователя, чего не хочет OP.date
столбец отличается отmax(p.date)
. Если вы добавите больше столбцов вpayments
таблицу (напримерcost
), все эти столбцы будут не из нужной строкиисточник
С вашим запросом есть две проблемы:
INNER JOIN (SELECT ...) AS p ON ...
.Предполагая, что нет никаких связей
payments.date
, попробуйте:источник
From payments as p Where p.user_id =@user_id
когда запрос выполняет группу по всей таблице.Ответ @John Woo помог мне решить аналогичную проблему. Я улучшил его ответ, установив правильный порядок. Это сработало для меня:
Однако я не уверен, насколько это эффективно.
источник
Это заставит его работать
источник
Матей Михай дал простое и эффективное решение, но оно не будет работать, пока не будет введена
MAX(date)
часть SELECT, поэтому этот запрос станет:И order by не повлияет на группировку, но может упорядочить конечный результат, предоставленный group by. Я попробовал, и у меня это сработало.
источник
Мой ответ, прямо вдохновленный @valex, очень полезен, если вам нужно несколько столбцов в предложении ORDER BY.
источник
Вы можете попробовать это:
источник