MySQL INNER JOIN只从第二个表中选择一行

Was*_*sim 83 mysql sql select inner-join

我有一个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
Run Code Online (Sandbox Code Playgroud)

Joh*_*Woo 124

您需要有一个子查询来获取最新的日期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
Run Code Online (Sandbox Code Playgroud)

  • 有没有内部联接的情况下执行此查询的方法?我想从表c返回最大值,或者如果没有行匹配,则返回null。将JOIN更改为LEFT JOIN显然不起作用。 (2认同)

Fin*_*sse 18

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
)
Run Code Online (Sandbox Code Playgroud)

此解决方案比公认的答案更好,因为当一些付款的用户和日期相同时,它可以正常工作。


Mat*_*hai 12

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
Run Code Online (Sandbox Code Playgroud)

看看这个sqlfiddle

  • "limit 1"子句只返回1个用户,而不是OP想要的用户. (5认同)
  • @MateiMihai,这不行.查询仅提供最大日期,而不是最大日期的整行.您可以在小提琴中看到它:`date`列与`max(p.date)`不同.如果在`payments`表中添加更多列(例如`cost`),那么所有列都不会来自所需的行 (5认同)