You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中如何通过单查询获取created_at日期唯一的记录

获取每日唯一记录的SQL查询方案

嘿,这个需求很常见,我来给你几种不同数据库下的解决方案,你可以根据自己使用的数据库类型来选择:

核心思路

我们需要先把created_at字段的日期部分提取出来,按日期分组,然后从每个日期组中选取一条记录(比如当天最早插入、最晚插入的,或者任意一条)。


1. MySQL / MariaDB 方案

方法一:子查询+IN

SELECT *
FROM your_table
WHERE id IN (
    -- 按日期分组,取每个组的最小id(对应当天最早插入的记录)
    SELECT MIN(id)
    FROM your_table
    GROUP BY DATE(created_at)
);

如果想要当天最晚插入的记录,把MIN(id)换成MAX(id)即可。

方法二:JOIN方式(性能更优)

SELECT t1.*
FROM your_table t1
JOIN (
    SELECT DATE(created_at) AS date_only, MIN(id) AS min_id
    FROM your_table
    GROUP BY date_only
) t2 ON t1.id = t2.min_id;

2. PostgreSQL 方案

PostgreSQL有个很方便的DISTINCT ON语法,能直接实现需求:

SELECT DISTINCT ON (CAST(created_at AS DATE)) *
FROM your_table
-- 先按日期排序,再按id排序(确保选当天最早的记录)
ORDER BY CAST(created_at AS DATE), id;

同样,把id换成created_at DESC就能选当天最晚的记录。

当然也可以用通用的子查询方式:

SELECT *
FROM your_table
WHERE id IN (
    SELECT MIN(id)
    FROM your_table
    GROUP BY CAST(created_at AS DATE)
);

3. SQL Server 方案

方法一:关联子查询

SELECT *
FROM your_table t1
WHERE id = (
    SELECT MIN(id)
    FROM your_table t2
    WHERE CAST(t2.created_at AS DATE) = CAST(t1.created_at AS DATE)
);

方法二:JOIN方式

SELECT t1.*
FROM your_table t1
JOIN (
    SELECT CAST(created_at AS DATE) AS date_only, MIN(id) AS min_id
    FROM your_table
    GROUP BY date_only
) t2 ON t1.id = t2.min_id;

补充:仅获取日期及代表记录ID

如果不需要整行数据,只是想得到每个日期对应的一条记录ID,直接用分组查询即可:

-- 以MySQL为例,其他数据库替换日期提取函数即可
SELECT DATE(created_at) AS date_only, MIN(id) AS representative_id
FROM your_table
GROUP BY date_only;

内容的提问来源于stack exchange,提问作者Xyrin Technologies

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:40:00