LEFT JOIN + ORDER BY 在 GROUP BY 之前
LEFT JOIN + ORDER BY before GROUP BY
我有两个表:公司和电子邮件。
我要select每个公司的最后一封邮件
我试过这个:
SELECT *
FROM companies
LEFT
JOIN emails
ON companies.company_id = emails.company_id
WHERE companies.status = 'active'
GROUP
BY emails.company_id
ORDER
BY emails.date DESC;
但这行不通,ORDER BY 部分应该在 GROUP BY 部分之前,因为我想获取每个公司的最后一封电子邮件,而不是对最终结果进行排序。
有人可以帮助我吗?
谢谢。
更新
我最终这样做了:
SELECT *
FROM companies
LEFT
JOIN (
SELECT company_id, date
FROM emails
ORDER
BY date DESC
) emails
ON companies.company_id = emails.company_id
WHERE companies.status = 'active'
GROUP
BY emails.company_id;
感谢您的帮助。
如果我以正确的方式理解你的问题,我认为类似的方法可行。
SELECT * FROM companies c
LEFT JOIN emails e ON c.company_id = e.company_id
AND (e.company_id, e.date) IN (
SELECT company_id, max(date) FROM emails GROUP BY company_id
)
WHERE c.status = 'active';
编辑:更新 Thorsten 的回答
我有两个表:公司和电子邮件。
我要select每个公司的最后一封邮件
我试过这个:
SELECT *
FROM companies
LEFT
JOIN emails
ON companies.company_id = emails.company_id
WHERE companies.status = 'active'
GROUP
BY emails.company_id
ORDER
BY emails.date DESC;
但这行不通,ORDER BY 部分应该在 GROUP BY 部分之前,因为我想获取每个公司的最后一封电子邮件,而不是对最终结果进行排序。
有人可以帮助我吗?
谢谢。
更新
我最终这样做了:
SELECT *
FROM companies
LEFT
JOIN (
SELECT company_id, date
FROM emails
ORDER
BY date DESC
) emails
ON companies.company_id = emails.company_id
WHERE companies.status = 'active'
GROUP
BY emails.company_id;
感谢您的帮助。
如果我以正确的方式理解你的问题,我认为类似的方法可行。
SELECT * FROM companies c
LEFT JOIN emails e ON c.company_id = e.company_id
AND (e.company_id, e.date) IN (
SELECT company_id, max(date) FROM emails GROUP BY company_id
)
WHERE c.status = 'active';
编辑:更新 Thorsten 的回答