如何正确 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 + ORDER BY 时如何避免 FileSort?