首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MySQL内连接仅从第二个表中选择一行

MySQL内连接仅从第二个表中选择一行
EN

Stack Overflow用户
提问于 2012-09-21 15:40:38
回答 10查看 258K关注 0票数 132

我有一个users表和一个payments表,对于每个用户,其中的那些有付款,在payments表中可能有多个关联的付款。我想选择所有的用户谁有付款,但只选择他们的最新付款。我正在尝试这个SQL,但我以前从未尝试过嵌套SQL语句,所以我想知道我做错了什么。感谢你的帮助

代码语言:javascript
复制
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
EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2012-09-21 15:45:12

您需要使用子查询来获取每个user ID的最新日期。

代码语言:javascript
复制
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
票数 183
EN

Stack Overflow用户

发布于 2018-07-05 19:23:36

代码语言:javascript
复制
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
)

代码语言:javascript
复制
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

票数 51
EN

Stack Overflow用户

发布于 2012-09-21 15:44:57

代码语言:javascript
复制
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

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12526194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档