GroupBy по электронной почте и получить самую раннюю дату создания в группе - Laravel Eloquent - PullRequest
0 голосов
/ 23 ноября 2018

Как я могу получить самую раннюю дату create_at при использовании groupBy в красноречивом утверждении?

У меня есть таблица со следующим:

| 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-скрипка http://sqlfiddle.com/#!9/89ee39/2

# EDIT - на основе ответана ответ

Благодаря Nesku, наконец, запрос, чтобы получить эту работу был:

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

1 Ответ

0 голосов
/ 23 ноября 2018

Вы не можете заказать по 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...