Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从mysql表中检索最后一条记录_Mysql_Sql_Group By_Sql Order By - Fatal编程技术网

从mysql表中检索最后一条记录

从mysql表中检索最后一条记录,mysql,sql,group-by,sql-order-by,Mysql,Sql,Group By,Sql Order By,我有一张桌子,上面有各种仪表的读数 +-----------+---------+---------+---------+---------------------+ | idReading | idMeter | index | usage | dateOfReading | +-----------+---------+---------+---------+---------------------+ | 671 | 189 | 884.000 |

我有一张桌子,上面有各种仪表的读数

+-----------+---------+---------+---------+---------------------+
| idReading | idMeter |  index  |  usage  | dateOfReading       |
+-----------+---------+---------+---------+---------------------+
|       671 |     189 | 884.000 | 441.000 | 2012-06-01 00:00:00 |
|       672 |     190 | 170.000 |  82.000 | 2012-06-01 00:00:00 |
|       584 |     190 |  88.000 |  88.000 | 2012-05-01 00:00:00 |
|       583 |     189 | 443.000 | 443.000 | 2012-05-01 00:00:00 |
+-----------+---------+---------+---------+---------------------+
在我的应用程序中,我需要提供当前读数(可能存在也可能不存在)和上一个读数(可能是几个月前的读数)。因此,我可能会在7月份进行当前的阅读,但之前的阅读可能会在4月份进行

我使用以下查询检索以前的读数:

SELECT * FROM (
  SELECT Reading.idMeter, Reading.usage, Reading.`Index`, Reading.dateOfReading
  FROM meterReadings AS Reading
  WHERE Reading.idMeter IN (189,190)
    AND Reading.dateOfReading < '2012-07-31'  
  ORDER BY Reading.dateOfReading DESC) AS OrderendReading
GROUP BY OrderendReading.idMeter
这很好,但我不高兴我在另一个SELECT中使用SELECT,因为我担心随着表越来越大,请求将花费越来越长的时间。 是否有其他方法检索以前的读数?或者有没有办法让这个查询更有效

或者,理想情况下,当前读数和前一读数都在同一个查询中


谢谢。

我昨天刚刚发现了“分析函数”,我很确定它们涵盖了这类需求。给它一个谷歌,在Youtube上也有一些教程

试试这个:

SELECT 
  Reading.idMeter, 
  Reading.usage, 
  Reading.`Index`,
  (Select dateOfReading from meterReading order by dateOfReading desc limit 1,1)  
FROM meterReadings AS Reading   
GROUP BY Reading.idMeter;

我认为相关子查询将实现您所追求的目标:

SELECT  Reading.idMeter, 
        Reading.usage, 
        Reading.`Index`, 
        Reading.dateOfReading,
        (   SELECT  mr.Usage
            FROM    MeterReadings AS mr
            WHERE   mr.idMeter = Reading.idMeter
            AND     mr.DateOfReading < Reading.DateofReading
            ORDER BY DateOfReading DESC
            LIMIT 1
        ) AS PreviousReadingUsage
FROM    meterReadings AS Reading,
WHERE   Reading.idMeter IN (189,190)
AND     Reading.dateOfReading < '2012-07-31'  
ORDER BY Reading.dateOfReading DESC

你试过使用吗?我只试过内部查询,没有排序,也没有使用group by,但它只给了我5月份的结果,甚至6月份的结果,所以我看不出LIMIT有什么帮助。在外部查询上使用LIMIT。您只需要前两个结果,对吗?我需要任意数量的米的读数,如in子句中所述,但我的表格不是按读取日期排序的,如示例中所示,它是按idReading列排序的。事实上,这里有一个示例:这更像是一个注释而不是答案。此外,这些在MySQL中还不可用。使用[我最近的答案]stackoverflow.com/questions/10980957/10983910中使用的递增变量是我所知道的唯一一种模拟其他DBMS的行数函数的方法。是的,我尝试过注释,但除非有答案,否则我似乎没有该选项。你知道为什么吗?这是对新会员的限制吗?我昨天刚加入。是的。我想它需要50的声誉,这让我只能从一米的读数。我需要in条款中所有仪表的读数。是的,对于in条款中指定的每个仪表。是的,这正是我需要的。