【问题标题】:Retrieving second last record from a mysql table从mysql表中检索倒数第二条记录
【发布时间】:2012-06-17 18:42:07
【问题描述】:

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

+-----------+---------+---------+---------+---------------------+
| 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,因为我担心随着表变得越来越大,请求会花费越来越长的时间。 有没有其他方法可以检索以前的读数?或者有什么方法可以让这个查询更有效率?

或者,理想情况下,在同一个查询中同时拥有当前阅读和前一个阅读?

谢谢。

【问题讨论】:

  • 你试过使用LIMIT吗?
  • 我只尝试了没有排序和使用 group by 的内部查询,但它只给了我 5 月的结果,甚至没有 6 月,所以我看不出 LIMIT 可能有什么帮助。
  • 在外部查询上使用LIMIT。你只想要前两个结果,对吧?
  • 我需要IN 子句中指定的任意数量的仪表的读数,但我的表格不是按示例中的 dateOfReading 排序的,而是按 idReading 列排序的。跨度>

标签: mysql sql group-by sql-order-by


【解决方案1】:

我认为相关子查询可以实现您的目标:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 其实这里有一个例子:stackoverflow.com/questions/2491063/…
    • 这更像是一个评论而不是一个答案。这些在 MySQL (Yet) 中也不可用。使用 [recent answer of mine](stackoverflow.com/questions/10980957/#10983910) 中使用的递增变量是我所知道的模拟其他 DBMS 的 ROW_NUMBER() 函数的唯一方法。
    • 是的,我试图发表评论,但除非有答案,否则我似乎没有该选项。任何想法为什么会这样?对新成员有限制吗?我昨天刚加入。
    • 是的。我认为它需要 50 的声望。
    【解决方案3】:

    试试这个:

    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;
    

    【讨论】:

    • 这给了我一米的读数。我需要IN 子句中所有仪表的读数。
    • 是的,对于我在IN 子句中指定的每个仪表。
    • 是的,这正是我所需要的。
    猜你喜欢
    • 1970-01-01
    • 2013-11-23
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多