SQL:如何选择每天的一条记录,假设每天包含多个值 MySQL

8

我想从'2013-04-01 00:00:00''今天'选择记录,但每天有很多值,因为他们每15分钟保存一个值,所以我只想要每天的第一个或最后一个值。

表结构:

CREATE TABLE IF NOT EXISTS `value_magnitudes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `value` float DEFAULT NULL,
  `magnitude_id` int(11) DEFAULT NULL,
  `sdi_belongs_id` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `reading_date` datetime DEFAULT NULL,
  `created_at` datetime DEFAULT NULL,
  `updated_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1118402 ;

错误的SQL:

SELECT value FROM `value_magnitudes` WHERE `value_magnitudes`.`reading_date` BETWEEN '2013-04-01 00:00:00' AND '2013-04-02 00:00:00' AND (`value_magnitudes`.magnitude_id = 234) LIMIT 1
SELECT value FROM `value_magnitudes` WHERE `value_magnitudes`.`reading_date` BETWEEN '2013-04-02 00:00:00' AND '2013-04-03 00:00:00' AND (`value_magnitudes`.magnitude_id = 234) LIMIT 1
SELECT value FROM `value_magnitudes` WHERE `value_magnitudes`.`reading_date` BETWEEN '2013-04-03 00:00:00' AND '2013-04-04 00:00:00' AND (`value_magnitudes`.magnitude_id = 234) LIMIT 1
SELECT value FROM `value_magnitudes` WHERE `value_magnitudes`.`reading_date` BETWEEN '2013-04-04 00:00:00' AND '2013-04-05 00:00:00' AND (`value_magnitudes`.magnitude_id = 234) LIMIT 1
SELECT value FROM `value_magnitudes` WHERE `value_magnitudes`.`reading_date` BETWEEN '2013-04-05 00:00:00' AND '2013-04-06 00:00:00' AND (`value_magnitudes`.magnitude_id = 234) LIMIT 1
etc ...

如果可能的话,我希望能够一次性完成所有操作...

非常感谢。

编辑: 我的意思是,我每天都有一个查询,但我只想从reading_date >= '2013-04-01 00:00:00'进行单个查询。

编辑2:table.value_magnitudes中有64,260条记录,执行和响应该查询需要很长时间,有时会超时连接。

3个回答

6
要获取每个日期的第一个条目,可以执行以下操作:
select * from value_magnitudes
where id in 
(
    SELECT min(id)
    FROM value_magnitudes
    WHERE magnitude_id = 234
    and date(reading_date) >= '2013-04-01'
    group by date(reading_date)
)

但如果我这样做,我将为每一天进行一次查询,直到达到今天,有没有可能在一个查询中完成?谢谢。 - Alejandro L.
是的,请在 where 条件中保留日期。我已更新我的答案。 - juergen d
啊哈,但是我想从X日期开始到今天,所以应该是类似于reading_date >= '2013-04-01 00:00:00'这样的。 - Alejandro L.
好的,谢谢。我已经建立了索引,但还是不行。无论如何,还是谢谢你 =D。 - Alejandro L.
我发布了一个新问题: http://stackoverflow.com/questions/16481049/mysql-innodb-long-time-of-query-execution - Alejandro L.
显示剩余3条评论

3
select * from value_magnitudes
where id in 
(
   SELECT min(id)
   FROM value_magnitudes
   WHERE `value_magnitudes`.`reading_date` BETWEEN '$from_selected' AND '$to_selected' and (magnitude_id = 234) group by date(reading_date)
)

0

使用上述示例 - 如果有人需要的话 - 它正在搜索无效记录,其中如果它是当天的第一行,则操作不应为0:

select * from log
where action=0 AND id in 
(
    SELECT min(id)
    FROM log
    group by date(ts)
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接