我如何解决旧版MySQL中缺少where子句子查询的问题?

时间:2011-10-14 16:47:22

标签: mysql sql subquery

我有一个表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。

2 个答案:

答案 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版本,我不能保证这对你的版本有用。


更新:以下是使用连接替换子查询的其他几个示例:

example 1
example 2


第二次更新:由于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.1FROM - 子句中允许子查询 - 所以希望这适用于您的系统。

答案 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.