如何使用mysql查询选择一个月中每天的第一个元素?
我有优惠表 - startdate,所以我可以查看每天,每月,每年我都会收到元素,但是,我想知道如何只获得某个月每天的第一个元素?
答案 0 :(得分:3)
假设以下
试试这个:
SELECT B.id FROM
(
SELECT DATE(dt) date_dt,MIN(dt) dt
FROM mytable
WHERE dt >= '2012-02-01 00:00:00'
AND dt < '2012-03-01 00:00:00'
GROUP BY DATE(dt)
) A
LEFT JOIN mytable B USING (dt);
如果任何dt有多个B.id值,请尝试:
SELECT dt,MIN(id) id
(
SELECT B.id,B.dt FROM
(
SELECT DATE(dt) date_dt,MIN(dt) dt
FROM mytable
WHERE dt >= '2012-02-01 00:00:00'
AND dt < '2012-03-01 00:00:00'
GROUP BY DATE(dt)
) A
LEFT JOIN mytable B USING (dt)
) AA GROUP BY dt;
答案 1 :(得分:1)
假设startdate
是DATETIME
类型,并且最早的条目是2012年3月最早的DATETIME值:
SELECT DISTINCT *
FROM tbl t1
LEFT JOIN tbl t2
ON (t2.startdate BETWEEN '2012-02-01 00:00:00' AND '2012-02-29 23:59:59')
AND t2.startdate < t1.startdate
WHERE (t1.startdate BETWEEN '2012-02-01 00:00:00' AND '2012-02-29 23:59:59')
AND t2.startdate IS NULL
如果没有重复日期,则您不需要DISTINCT
。
此查询通过加入同一个月的任何早期记录来工作,因此如果没有加入任何内容,则最早通过消除过程。
本书SQL Antipatterns中详细解释了这种技术。
这也可以通过子查询来解决,但是这种类型的JOIN应该比MySQL更容易优化,而子查询通常会否定索引的使用。
答案 2 :(得分:0)
在不知道你桌子的确切结构的情况下,这样的事情应该有效:
SELECT MIN(offerId) FROM offers WHERE startdate <= '2012-03-06' AND startdate >= '2012-02-06' GROUP BY date(startdate)
答案 3 :(得分:0)
只是为了给这只猫提供一种不同的方法(实际上在SQL Server中更容易实现一次)
SELECT
t0.offerId
FROM
offers AS t0 LEFT JOIN
offersAS t1 ON t0.offerId = t1.offerId AND t1.startDate > t0.startDate AND
(t0.startDate BETWEEN '2012-02-01' AND '2012-03-01') AND
(t1.startDate BETWEEN '2012-02-01' AND '2012-03-01')
WHERE
t1.col1 IS NULL;
如果您有多个具有相同确切时间的行,则会返回多个值,您可以在应用程序逻辑中或使用子查询进行清除。顺便说一句,这被称为分组最小/最大。
答案 4 :(得分:0)
听起来你正在尝试做类似以下的事情:
SELECT col_1, date_col, col_3 FROM tbl
WHERE
date_col = ( SELECT min(date_col) FROM tbl
WHERE
year(date_col) = 2006 AND
month(date_col) = 02
);
这也可用于查找max( date_col )
。希望这会有所帮助。