2012-05-25 44 views
0

我正在寻找类似的MySQL:[错误] 1146 - 表“或者”不存在

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` 

查询请给我一些sugge stions。

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

回答

-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`; 
+0

你有额外的'('。而且当指定别名时不需要'AS' – triclosan

+0

@triclosan,thx – Sergey

+0

'loolse'从哪里来? –

1

你想要什么,对于第一个查询(有一些修改)工作,被称为通用表表达式和MySQL没有这个功能。

如果你的第二个查询不能很好地执行,您可以使用此:

SELECT 
    fuz.*, 
    fuz_grp.max_bar 
FROM 
    fuz 
    CROSS JOIN 
    (SELECT MAX(bar) AS max_bar 
     FROM fuz 
    ) AS fuz_grp 
+0

感谢您让我知道功能名称。我会把一些研究,改天:) 在题目:如果实际的查询就像 '选择 FUZ *, fuz_grp.max_bar FROM FUZ, <很多其他的东西比如连接,等> CROSS JOIN (SELECT MAX(条)AS max_bar FROM FUZ <同很多其他的东西比如连接等> )AS fuz_grp' 费用也我一样,就像我做问题后面的查询? – Rocco

+0

我认为成本取决于优化器(您使用的MySQL版本)。但直到最近,MySQL不得不两次执行相同的子查询,无论你如何编写它。意思是说,没有简单的方法来编写它并且巧妙地执行(除了将使用一些内部缓存外)。 –

+1

最近的MariaDB版本(5.3和5.5)有几个优化器的改进,因此您可以在那里检查/测试您的查询(像缓存子查询这样的改进,因此可能所有上述版本,您和我的运行速度都会更快,因为它们会使用一个子查询的结果执行另一个)。 MySQL 5.6(发布时仍处于测试阶段)也会有一些改进。 –

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 | 
+0

我认为这正是我在问题中的后面的查询所做的,对吗?但是感谢创建和填充示例数据:D – Rocco

+0

那么......也许这些建议是相同的。我不是MySQL专家,但有时查询规划者不会采用最短路径,并且MySQL可能会为外部查询的每一行运行内部查询,从而导致可能会产生大量开销的情况。使用标量变量将永远不会发生这种情况;) –

相关问题