【问题标题】:Laravel retrieve the latest records by date and group them by labelLaravel 按日期检索最新记录并按标签分组
【发布时间】:2021-09-02 04:26:39
【问题描述】:

我正在尝试按日期检索最新记录,然后按 ID 检索并按标签对它们进行分组。到目前为止,我可以正确检索它们。 问题是;我无法获取 ID,因为它是 group by,结果中可能有超过 1 个。

桌子

id label end_date
12 quarterly 2011-06-30
13 quarterly 2010-01-01
14 annual 2011-06-30
15 annual 2011-06-30
16 monthly 2012-06-30
17 monthly 2011-06-30

预期结果

id label end_date
12 quarterly 2011-06-30
15 annual 2011-06-30
16 monthly 2012-06-30

我尝试过的

$premiums = Premium::selectRaw('label, max(end_date) as end_date')
            ->groupBy('label')
            ->get();

注意事项:

  • 我尝试将id 添加到selectRaw,但它返回错误

SQLSTATE[42000]:语法错误或访问冲突:1055 SELECT 列表的表达式 #3 不在 GROUP BY 子句中,并且包含在功能上不依赖于 GROUP BY 子句中的列的非聚合列“premiums.id”;这与 sql_mode=only_full_group_by 不兼容(SQL: select label, max(end_date) as end_date, id from premiums group by label

  • 我也尝试将max(id) as id 添加到selectRaw,但它返回错误的结果 (ID 与数据库中对应的日期/标签不匹配)

【问题讨论】:

  • @Strawberry 我认为将max(id) as id 添加到selectRaw 会给我这个。由于group by label 不允许您拥有多个 ID,因此我将最后一个 ID 放在首位。

标签: mysql eloquent laravel-8


【解决方案1】:

在原始 sql 中,也许你追求的是这样的:

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id SERIAL PRIMARY KEY
,label VARCHAR(12) NOT NULL
,end_date DATE NOT NULL
);

INSERT INTO my_table VALUES
(12,'quarterly','2011-06-30'),
(13,'quarterly','2010-01-01'),
(14,'annual'   ,'2011-06-30'),
(15,'annual'   ,'2011-06-30'),
(16,'monthly'  ,'2012-06-30'),
(17,'monthly'  ,'2011-06-30');

SELECT x.*
  FROM my_table x
  JOIN
     ( SELECT MAX(a.id) id
         FROM my_table a
         JOIN
            ( SELECT label
                   , MAX(end_date) end_date
                FROM my_table
               GROUP
                  BY label
            ) b
           ON b.label = a.label
          AND b.end_date = a.end_date
        GROUP
           BY a.label
     ) y
    ON y.id = x.id;
    
+----+-----------+------------+
| id | label     | end_date   |
+----+-----------+------------+
| 15 | annual    | 2011-06-30 |
| 16 | monthly   | 2012-06-30 |
| 12 | quarterly | 2011-06-30 |
+----+-----------+------------+

【讨论】:

  • 一流!它就像一个魅力!使用DB::select( your_query ) 谢谢! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-31
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
  • 1970-01-01
相关资源
最近更新 更多