我正在运行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。
因此,我的问题是:
任何帮助将不胜感激!
由于
答案 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)
上创建一个索引,以便快速工作。