如何正确 LEFT JOIN 用户与交易

Posted

技术标签:

【中文标题】如何正确 LEFT JOIN 用户与交易【英文标题】:How to properly LEFT JOIN users with transactions 【发布时间】:2011-04-16 22:30:05 【问题描述】:
   SELECT *
     FROM users
LEFT JOIN payments ON payments.user_id = users.user_id
    WHERE payments.id = (SELECT max(p2.id) 
                           FROM payments p2 
                          WHERE payments.user_id = p2.user_id)

是我目前用来选择用户信息的查询,以及他们的最后一笔交易。问题是我想选择用户,即使他们在数据库中没有事务,我该怎么做?

我正在玩的表结构非常简单:

USERS - user_id, name
PAYMENTS - id, user_id, method

【问题讨论】:

【参考方案1】:

你可能会更好(在性能方面)加入这样的子查询:

SELECT *
  FROM users u
LEFT JOIN 
(Select user_id, max(id) from payments group by user_id) p
ON p.user_id = u.user_id

通过在 Where 子句中放置任何条件,您将其转换为内连接,

【讨论】:

如果您想比较答案,请查看执行计划并测试两者。【参考方案2】:

试试这样的:

SELECT users.*, payments.*
  FROM users
LEFT JOIN payments ON payments.user_id = users.user_id
                  AND payments.id = (SELECT max(p2.id) 
                                       FROM payments p2 
                                      WHERE payments.user_id = p2.user_id)

结果集中有两列“user_id”,一列来自用户表,一列来自付款。 Payments.user_id 将为空,但 users.user_id 应该有值。

【讨论】:

这将为没有交易的用户返回一个空白的 user_id 值。 users.user_id 不应为空,您在查看 payment.user_id 吗? 对不起,我的错。忽略了第一列。足够长时间盯着 auto inc 列了:P 您能否将您的示例与 Shoulb 先生的示例进行对比?只是试图确定最好的。【参考方案3】:

为什么每个人都在做那些疯狂的事情?

select u.user_id u_uid, u.name, p.user_id p_uid, p.method from users u left join payments p on (u.user_id = p.user_id);

【讨论】:

这将返回所有付款行。我只希望用户附加他们最后的付款数据。

以上是关于如何正确 LEFT JOIN 用户与交易的主要内容,如果未能解决你的问题,请参考以下文章

LEFT JOIN 或 REGULAR JOIN,以及如何将 MySql 表与数组进行比较?需要表现!

如何根据列值与没有关联的表进行 LEFT JOIN

使用 LEFT JOIN + ORDER BY 时如何避免 FileSort?

如何在 Django 1.9 中表达 sqlite LEFT OUTER JOIN?

我们如何使用旧语法进行 LEFT JOIN?

如何将 LEFT JOIN 限制为 SQL Server 中的第一个结果?