php - 按电子邮件分组并获取组中最早创建的日期 - Laravel Eloquent

标签 php mysql laravel eloquent

在 Eloquent 语句中使用 groupBy 时,如何获得最早的created_at日期?

我有一个包含以下内容的表格:

| id | name   | email   | created_at          |
|----|--------|---------|---------------------|
| 1  | test   | 1@1.com | 2018-01-01 09:00:00 |
| 2  | test   | 1@1.com | 2018-01-02 09:00:00 |
| 3  | test 2 | 2@2.com | 2018-01-02 09:00:00 |
| 4  | test 2 | 2@2.com | 2018-01-03 09:00:00 |
| 5  | test   | 1@1.com | 2018-01-03 09:00:00 |
| 6  | test   | 1@1.com | 2018-01-04 09:00:00 |
| 7  | test   | 1@1.com | 2018-01-05 09:00:00 |
| 8  | test 3 | 3@3.com | 2018-01-06 09:00:00 |
| 9  | test 3 | 3@3.com | 2018-01-07 09:00:00 |

运行以下查询时:

Customers::OrderBy('created_at', 'desc')->groupBy('email')->paginate('5');

我期望按以下顺序获得结果:

Test 3 (created: 2018-01-07)
Test   (created: 2018-01-05)
Test 2 (created: 2018-01-03)

但相反,我发现它看起来并不尊重 OrderBy

Test 3 (created: 2018-01-06)
Test 2 (created: 2018-01-02)
Test   (created: 2018-01-01)

这是 SQL fiddle http://sqlfiddle.com/#!9/89ee39/2

# 编辑 - 根据响应回答

感谢 Nesku,最终使该工作正常运行的查询是:

 return DB::table('customers')
        ->select(DB::raw('email, max(created_at)'))
        ->groupBy('email')
        ->orderBy('max(created_at)', 'desc')
        ->get();

最佳答案

您无法按 created_at 进行排序,因为它包含多个值,但是您可以为每封电子邮件取 created_at 的最大值并按该值进行排序。

SQL 查询如下所示:

SELECT email, max(created_at)
FROM `customers`
GROUP BY email
ORDER BY max(created_at) DESC

http://sqlfiddle.com/#!9/89ee39/12

关于php - 按电子邮件分组并获取组中最早创建的日期 - Laravel Eloquent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53450987/

相关文章:

python - mysql-connector python 'IN' 运算符存储为列表

php - 如何更改 Laravel 5 中的默认登录 URL?

javascript - 在 laravel 中使用 FormData 上传文件时输入为空

php - Wordpress - 覆盖主题 CSS 样式表

php - 我无法将日期从 codeigniter 插入到 mysql DATE 列

PHP问题数组选择使用

php - PHP 中的 MAMP exec 命令在 Apache 环境中找不到 mysql(在 CLI 中工作)

mysql - 从json数据创建mysql数据库

php - 未知的 MySQL 插入错误

php - Mailchimp 不适用于生产环境 [laravel on azure]