mysql - SQL - 加入 MAX(created_at)

标签 mysql sql greatest-n-per-group

问题

我有 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/

相关文章:

php - 使用 php 将 csv 上传到 MySQL 并更新

php - 通过php、mysql脚本将大量记录(大约40,000条)插入到mysql中

mysql - 查找具有最少关联记录的记录

mysql - 不使用 UNION 重写 MySQL 查询

mysql - 在 cakephp3 中迁移

mysql - 获取百分比和 group by 语句

mysql - 使用查询关键字搜索

mysql - 连接3个包含空值的表Mysql

sql - 对同一张表的不同条件的多个相关子查询

Mysql - 从表 B 引用时需要获取表 A 的最新信息