我有一个表Foo,其中包含A,B和C列。我需要从中得到的是A的每个不同值,以及C in的值,其中包含具有最大B的行A.
如果我这样做:
select A, max(B)
from Foo
group by A
这给了我每个A最大的B,我可以根据这些结果运行另一个查询来获得我需要的C值。但我希望能够在一个查询中执行此操作。
有人可能会在where子句中建议子查询,但我使用的MySQL版本不支持。我无法将MySQL更新到更高版本。有没有办法可以在一个查询中得到我需要的东西?
我正在使用MySQL 4.0.27。
答案 0 :(得分:3)
因此,您要为每个A
选择具有最大B
的行。
你几乎就在那里 - 你只需要将你的查询加入到原始表中:
SELECT Foo.* FROM Foo
INNER JOIN (
SELECT A, MAX(B) AS MAXB
FROM Foo
GROUP BY A
) AS Subtable -- your original query
ON Subtable.MAXB = Foo.B and Foo.A = Subtable.A;
注意:由于我不知道你使用的MySQL版本,我不能保证这对你的版本有用。
更新:以下是使用连接替换子查询的其他几个示例:
第二次更新:由于MySQL兼容性问题,此版本移动子查询,并添加隐式连接,将连接条件放在where子句中:
SELECT Foo.*
FROM
Foo,
(SELECT A, MAX(B) AS MAXB
FROM Foo
GROUP BY A
) AS Subtable -- your original query
WHERE Subtable.MAXB = Foo.B and Foo.A = Subtable.A;
来源:根据MySQL manual for 4.0 and 4.1,FROM
- 子句中允许子查询 - 所以希望这适用于您的系统。
答案 1 :(得分:0)
不确定旧的MySQL是否支持派生表,但我会使用类似的东西:
SELECT t2.*
FROM (
SELECT A, max(B) as B
FROM Foo
GROUP BY A
) t1
JOIN (
SELECT A, max(B) as B, C
FROM Foo
GROUP BY A, C
) t2 ON t1.A = t2.A AND t1.B = t2.B
第一个派生表将第二个派生表限制为每个不同A的最高值B.