抵消MySQL Max

时间:2011-01-13 13:10:21

标签: sql mysql subquery max

我正在运行MySQL查询以获取按每个字段分组的每行的最高ID。我这样做:

SELECT period,max(id) AS maxid
FROM f
WHERE type = '1'
GROUP BY period

这会产生:

+--------+-------+
| period | maxid |
+--------+-------+
| 1      | 21878 |
| 2      | 21879 |
| 3      | 20188 |
| 4      | 21873 |
| 5      | 21872 |
| 6      | 21874 |
| 7      | 21875 |
| 8      | 21876 |
| 9      | 21877 |
+--------+-------+

这是我期待的结果。

但是,我现在想要运行一个查询,该查询返回每个句点的最大ID但是一个。我认为最好的方法是在LIMIT上使用偏移参数。为了测试这是否有效,我跑了:

SELECT period,(SELECT id FROM freight_data ORDER BY id DESC LIMIT 1) AS maxid
FROM f
WHERE type = '1'
GROUP BY period

这会产生:

+--------+-------+
| period | maxid |
+--------+-------+
| 1      | 21903 |
| 2      | 21903 |
| 3      | 21903 |
| 4      | 21903 |
| 5      | 21903 |
| 6      | 21903 |
| 7      | 21903 |
| 8      | 21903 |
| 9      | 21903 |
+--------+-------+

我可以看到为什么会发生这种情况,因为我的子查询在获取ID时没有考虑任何条件,所以它只是返回表中的最高ID。

因此,我的问题是:

  • MAX如何运作?和
  • 有没有办法可以产生与max(id)类似的结果,但会被一个结果偏移?

任何帮助将不胜感激!

由于

3 个答案:

答案 0 :(得分:2)

你可以这样做,这只是有点可怕:

SELECT DISTINCT ff.period, (
    SELECT id 
    FROM f 
    WHERE period = ff.period 
    AND type = '1' 
    ORDER BY id DESC
    LIMIT 1, 1
) as max_id_but_1
FROM f as ff
WHERE type = '1';

编辑:

如果每个id只属于一个句点,我想你可以使用它:

SELECT period, max(id)
FROM f
WHERE type = '1'
AND id NOT IN (
    SELECT max(id)
    FROM f
    WHERE type = '1'
    GROUP BY period
)
GROUP BY period;

但是,如果只有一行,您将无法获得结果。当然,你可以编写代码。

答案 1 :(得分:1)

如果我正确理解你的问题,你想要每个时期的第二高ID,对吗?

这是非常好的,当然没有经过测试:

SELECT period,max(id) AS maxid
FROM f
WHERE type = '1'
AND maxid NOT IN(
  SELECT period,max(id) AS maxid
  FROM f
  WHERE type = '1'
  GROUP BY period
)
GROUP BY period

您可能会在标识符'maxid'上遇到一些冲突。

答案 2 :(得分:1)

SELECT  period,
        (
        SELECT  id
        FROM    f fi
        WHERE   fi.type = '1'
                AND fi.period = f.period
        ORDER BY
                type DESC, period DESC, id DESC
        LIMIT 1, 1
        )
FROM    f
WHERE   type = '1'
GROUP BY
        period

f (type, period, id)上创建一个索引,以便快速工作。