来自 SQL/92 的查询在更高版本中不起作用
a query from SQL/92 doesn't work in later versions
我有一个 sql 查询是这样的:
select tt.product_name, tt.countt
from (select ofr.product_name as product_name, count(*) as countt
from offers ofr
group by ofr.product_name) as tt
where 12 = (select max(tt.countt) from tt);
我的问题在最后一行:sql 无法识别 table tt!
据我所知,在 SQL/92 中,table 的这种用法有效。
但是我不知道在以后的版本中应该使用什么替代方法。
我正在使用这个版本的 MY-SQL:
mysql Ver 14.14 Distrib 5.7.25,用于 Linux (x86_64) 使用 EditLine wrapper
更新:
我想要 tt 中 "countt" 的行是 tt 中所有行中的最大值。数字“12”是一个示例,因为根据我数据库中的数据,"count" 列的最大值将为 12
我不明白 max()
的目的是什么。如果这个 ever 在 MySQL 中工作,我会感到惊讶。
也许你打算:
select tt.product_name, tt.countt
from (select ofr.product_name as product_name, count(*) as countt
from offers ofr
group by ofr.product_name
) tt
where 12 = tt.countt;
此逻辑不需要子查询。您可以改用 HAVING
子句。
编辑:
如果你想要最大值,可以使用ORDER BY
和LIMIT
:
select ofr.product_name as product_name, count(*) as countt
from offers ofr
group by ofr.product_name
order by countt desc
limit 1;
在 MySQL 5.x 中对我有用的唯一解决方案需要重复您的查询。在 MySQL 8.x 中,您可以使用 CTE(通用 Table 表达式),但在 5.x.
中不可用
无论如何,这是有效的查询:
select x.*
from (
select product_name, count(*) as cnt
from offers
group by product_name
) x
join (
select max(cnt) as ct
from (
select product_name, count(*) as cnt
from offers
group by product_name
) y
) z on z.ct = x.cnt
结果:
product_name cnt
------------ ---
Daguerrotype 3
供参考,我使用的数据是:
create table offers (
product_name varchar(30)
);
insert into offers (product_name) values ('Daguerrotype');
insert into offers (product_name) values ('Transistor radio');
insert into offers (product_name) values ('Victrola');
insert into offers (product_name) values ('Daguerrotype');
insert into offers (product_name) values ('Victrola');
insert into offers (product_name) values ('Daguerrotype');
我有一个 sql 查询是这样的:
select tt.product_name, tt.countt
from (select ofr.product_name as product_name, count(*) as countt
from offers ofr
group by ofr.product_name) as tt
where 12 = (select max(tt.countt) from tt);
我的问题在最后一行:sql 无法识别 table tt!
据我所知,在 SQL/92 中,table 的这种用法有效。 但是我不知道在以后的版本中应该使用什么替代方法。
我正在使用这个版本的 MY-SQL:
mysql Ver 14.14 Distrib 5.7.25,用于 Linux (x86_64) 使用 EditLine wrapper
更新: 我想要 tt 中 "countt" 的行是 tt 中所有行中的最大值。数字“12”是一个示例,因为根据我数据库中的数据,"count" 列的最大值将为 12
我不明白 max()
的目的是什么。如果这个 ever 在 MySQL 中工作,我会感到惊讶。
也许你打算:
select tt.product_name, tt.countt
from (select ofr.product_name as product_name, count(*) as countt
from offers ofr
group by ofr.product_name
) tt
where 12 = tt.countt;
此逻辑不需要子查询。您可以改用 HAVING
子句。
编辑:
如果你想要最大值,可以使用ORDER BY
和LIMIT
:
select ofr.product_name as product_name, count(*) as countt
from offers ofr
group by ofr.product_name
order by countt desc
limit 1;
在 MySQL 5.x 中对我有用的唯一解决方案需要重复您的查询。在 MySQL 8.x 中,您可以使用 CTE(通用 Table 表达式),但在 5.x.
中不可用无论如何,这是有效的查询:
select x.*
from (
select product_name, count(*) as cnt
from offers
group by product_name
) x
join (
select max(cnt) as ct
from (
select product_name, count(*) as cnt
from offers
group by product_name
) y
) z on z.ct = x.cnt
结果:
product_name cnt
------------ ---
Daguerrotype 3
供参考,我使用的数据是:
create table offers (
product_name varchar(30)
);
insert into offers (product_name) values ('Daguerrotype');
insert into offers (product_name) values ('Transistor radio');
insert into offers (product_name) values ('Victrola');
insert into offers (product_name) values ('Daguerrotype');
insert into offers (product_name) values ('Victrola');
insert into offers (product_name) values ('Daguerrotype');