【问题标题】:SQL: How to select one record per day, assuming that each day contain more than 1 value MySQLSQL:如何每天选择一条记录,假设每天包含多于1个值MySQL
【发布时间】:2013-05-05 00:26:11
【问题描述】:

我想从'2013-04-01 00:00:00''today' 中选择记录,但是,每一天都有很多价值,因为它们每 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'c 进行一次查询

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

【问题讨论】:

    标签: php mysql sql query-optimization sql-optimization


    【解决方案1】:

    要获得每个日期的第一个条目

    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)
    )
    

    【讨论】:

    • 但是如果我这样做了,我会在今天之前每天进行一次查询,是否可以在一次查询中完成?谢谢。
    • 是的,将日期留在 where 条件中。我更新了我的答案。
    • Aham,但我想从 X 日期开始到今天,所以它会像 reading_date >= '2013-04-01 00:00:00'
    • 好的,谢谢我已编入索引但仍然无法正常工作,但无论如何,谢谢 =D
    • 使用explain 查看问题出在哪里。像这样:explain select * from ....。如果你不能让它工作,你可以问另一个问题。
    【解决方案2】:
    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)
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-04
      • 1970-01-01
      • 1970-01-01
      • 2020-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多