0

我正在寻找类似的东西

SELECT
    `foo`.*,
    (SELECT MAX(`foo`.`bar`) FROM `foo`)
FROM
    (SELECT * FROM `fuz`) AS `foo`;

但似乎foo在嵌套查询中无法识别,因为存在类似的错误

[Err] 1146 - Table 'foo' doesn't exist

我尝试上面的查询,因为我认为它比类似的更快

SELECT
    `fuz`.*,
    (SELECT MAX(`bar`) FROM `fuz`) as max_bar_from_fuz
FROM `fuz`

请给我一些建议。

编辑:我正在寻找性能比第二个查询更好的解决方案。请假设我的表fuz是一个非常非常大的表,因此运行一个额外的查询会max_bar花费我很多。

4

3 回答 3

1

为了使第一个查询(经过一些修改)起作用,您想要的称为公共表表达式,而 MySQL 没有该功能。

如果您的第二个查询表现不佳,您可以使用这个:

SELECT
    fuz.*,
    fuz_grp.max_bar
FROM 
    fuz
  CROSS JOIN
    ( SELECT MAX(bar) AS max_bar
      FROM fuz
    ) AS fuz_grp
于 2012-05-25T10:45:24.670 回答
0

在 SELECT 子句中创建的别名只能用于访问标量值,它们不是表的同义词。如果要为所有返回的行返回列的最大值,可以通过在之前运行查询来计算最大值到变量中,然后将此变量用作查询中的标量值来实现,例如:

-- create and populate a table to demonstrate concept
CREATE TABLE fuz (bar INT, col0 VARCHAR(20), col1 VARCHAR(20) );
INSERT INTO fuz(bar, col0, col1) VALUES (1, 'A', 'Airplane');
INSERT INTO fuz(bar, col0, col1) VALUES (2, 'B', 'Boat');
INSERT INTO fuz(bar, col0, col1) VALUES (3, 'C', 'Car');

-- create the scalar variable with the value of MAX(bar)
SELECT @max_foo:=MAX(bar) FROM fuz;

-- use the scalar variable into the query
SELECT *, @max_foo AS `MAX_FOO`
FROM fuz;

-- result:
-- | BAR | COL0 |     COL1 | MAX_FOO |
-- |-----|------|----------|---------|
-- |   1 |    A | Airplane |       3 |
-- |   2 |    B |     Boat |       3 |
-- |   3 |    C |      Car |       3 |
于 2012-05-25T10:45:27.477 回答
-1

只需简单使用 MAX 函数:

SELECT
    `fuz`.*,
    MAX(`fuz`.`bar`)
FROM
    `fuz`

或者如果你使用

SELECT
    `foo`.*,
    MAX(`foo`.`bar`)
FROM
    (SELECT * FROM `fuz` JOIN `loolse' ON (`fuz`.`field` = `loolse`.`smile`)) AS `foo`;
于 2012-05-25T10:39:39.197 回答