问题
我有 3 个表:客户、公司和电话。
一个客户有很多公司,一个公司有很多电话。 (一对多)。
公司的当前状态是公司最后一次调用 (MAX(created_at)) 的结果。
现在我想要一个客户的所有公司的列表,以及结果中最后一次通话的列。
需要的结果
结果应该是:
company.*, lastcall.*,
- 可能存在具有相同 created_at 日期的调用。那么结果中应该只有 1 行。
- 并非所有公司都有电话,公司应该仍在结果中并且电话的列应该为 NULL。 (左加入)
表格
客户
- id (int, primary key)
- 名称(可变字符)
- 地址 (varchar)
- 城市(varchar)
公司
- id (int, primary key)
- customer_id (int)
- 名称(可变字符)
- 地址 (varchar)
- 城市(varchar)
通话
- id (int, primary key)
- company_id (int)
- 结果(varchar)
- 创建时间(日期时间)
尝试
我提出的一个无效查询是:
SELECT * FROM companies co
LEFT JOIN calls ca ON co.id = ca.company_id
WHERE co.customer_id = ?
GROUP BY co.id
HAVING ca.created_at = (SELECT max(ll.created_at) FROM calls ll WHERE ll.company_id = co.id)
最佳答案
你应该只加入一个选择,这样你就不会试图重新评估选择。
SELECT co.id, co.label, ca.result, ca.id, t.date_created as most_recent
FROM companies co
LEFT JOIN
( SELECT MAX(created_at) as date_created, company_id
FROM calls
GROUP BY company_id
) t ON t.company_id = co.id
JOIN calls ca ON ca.company_id = t.company_id AND t.date_created = ca.created_at
WHERE co.customer_id = ?
编辑:
问题是每个公司在最大日期有多个电话。要对此进行测试,只需抽出一位客户和一家公司,然后查看结果。
SELECT co.id, co.label, ca.result, ca.id, ca.created_at as most_recent_date
FROM companies co
LEFT JOIN
( SELECT MAX(created_at) as date_created, company_id
FROM calls
GROUP BY company_id
) t ON t.company_id = co.id
JOIN calls ca ON ca.company_id = t.company_id AND t.date_created = ca.created_at
WHERE co.customer_id = ? AND co.id = ?
运行此查询并指定特定公司。查看 move_recent_date
列并查看每一行的日期是否相同以及它是否是最大日期
关于mysql - SQL - 加入 MAX(created_at),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27260258/