我有一个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
发布于 2012-09-21 15:45:12
您需要使用子查询来获取每个user ID
的最新日期。
SELECT a.*, c.*
FROM users a
INNER JOIN payments c
ON a.id = c.user_ID
INNER JOIN
(
SELECT user_ID, MAX(date) maxDate
FROM payments
GROUP BY user_ID
) b ON c.user_ID = b.user_ID AND
c.date = b.maxDate
WHERE a.package = 1
发布于 2018-07-05 19:23:36
SELECT u.*, p.*
FROM users AS u
INNER JOIN payments AS p ON p.id = (
SELECT id
FROM payments AS p2
WHERE p2.user_id = u.id
ORDER BY date DESC
LIMIT 1
)
或
SELECT u.*, p.*
FROM users AS u
INNER JOIN payments AS p ON p.user_id = u.id
WHERE NOT EXISTS (
SELECT 1
FROM payments AS p2
WHERE
p2.user_id = p.user_id AND
(p2.date > p.date OR (p2.date = p.date AND p2.id > p.id))
)
这些解决方案比accepted answer更好,因为当存在具有相同用户和日期的多个支付时,它们可以正常工作。你可以使用try on SQL Fiddle。
发布于 2012-09-21 15:44:57
SELECT u.*, p.*, max(p.date)
FROM payments p
JOIN users u ON u.id=p.user_id AND u.package = 1
GROUP BY u.id
ORDER BY p.date DESC
查看此sqlfiddle
https://stackoverflow.com/questions/12526194
复制相似问题