的MySQL:[错误] 1146 - 表“或者”不存在
我正在寻找类似的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
是非常非常大的表格,因此运行额外的查询花费了我很多。
只是简单的使用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`;
你想要什么,对于第一个查询(有一些修改)工作,被称为通用表表达式和MySQL没有这个功能。
如果你的第二个查询不能很好地执行,您可以使用此:
SELECT
fuz.*,
fuz_grp.max_bar
FROM
fuz
CROSS JOIN
(SELECT MAX(bar) AS max_bar
FROM fuz
) AS fuz_grp
感谢您让我知道功能名称。我会把一些研究,改天:) 在题目:如果实际的查询就像 '选择 FUZ *, fuz_grp.max_bar FROM FUZ, CROSS JOIN (SELECT MAX(条)AS max_bar FROM FUZ )AS fuz_grp' 费用也我一样,就像我做问题后面的查询? – Rocco
我认为成本取决于优化器(您使用的MySQL版本)。但直到最近,MySQL不得不两次执行相同的子查询,无论你如何编写它。意思是说,没有简单的方法来编写它并且巧妙地执行(除了将使用一些内部缓存外)。 –
最近的MariaDB版本(5.3和5.5)有几个优化器的改进,因此您可以在那里检查/测试您的查询(像缓存子查询这样的改进,因此可能所有上述版本,您和我的运行速度都会更快,因为它们会使用一个子查询的结果执行另一个)。 MySQL 5.6(发布时仍处于测试阶段)也会有一些改进。 –
别名创建成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 |
我认为这正是我在问题中的后面的查询所做的,对吗?但是感谢创建和填充示例数据:D – Rocco
那么......也许这些建议是相同的。我不是MySQL专家,但有时查询规划者不会采用最短路径,并且MySQL可能会为外部查询的每一行运行内部查询,从而导致可能会产生大量开销的情况。使用标量变量将永远不会发生这种情况;) –
你有额外的'('。而且当指定别名时不需要'AS' – triclosan
@triclosan,thx – Sergey
'loolse'从哪里来? –